2017-01-20 9 views
1

私は、GRE単語や各単語のその他の詳細を管理できるDjangoのアプリケーションを作っています。だから私が学んだ新しい単語を追加するたびに、単語とその詳細をアルファベット順にデータベースに挿入する必要があります。また、検索中に、私はデータベースから抽出したい特定の単語の詳細が必要です。Django - データベースに昇順でエントリを効率的に追加するにはどうすればいいですか?

効率が主な問題です。

SQLiteを使用する必要がありますか?ファイルを使うべきですか? JSONオブジェクトを使用してデータを格納する必要がありますか? ファイルを使用するのが最も効率的な場合、どのデータ構造を実装する必要がありますか? 効率的にこれを行うためのDjangoの関数はありますか? 各単語には意味、文、絵、根があります。どのようにこの情報をすべて保存する必要がありますか?

答えがDjango固有ではなく、アルゴリズムやデータベースの種類について話し合っても問題ありません。

+1

私の最初の質問は、挿入時にアルファベット順を維持する理由でしょうか?つまり、その挿入に続くすべてのテーブルレコードを自動的に変更する必要があります。データベースからソートされた結果を取得できます。 djangoでは、order_by( "field_name")を使用できます。用語やアルゴリズムでは、特殊なデータ構造を使用しない限り、そのようなアプローチは遅いです。どのような種類のデータ構造を使用してデータベースインデックスを作成するかを見てみましょう。 – chaos

+0

検索フィールドに誰かが何文字か入力すると、すべての辞書のように、それらの文字から始まるすべての単語が表示されます。確かに私はそれについて読むでしょう。 –

+1

データベースにデータがどのように格納されているか気にする必要はありません。それはまったく自分の懸念事項です。データがどのように戻ってくるかだけを気にする必要があります。これは注文によって制御できます。 –

答えて

1

これは完全にdjangoに関連するものではないので、私はデータの観点から答えるつもりです。

あなたの質問から、各行の固定された識別子があるように見えます:単語、文字列、および固定された属性のセット。

エンタープライズレベルのRDBMSの使用をお勧めします。 djangoの場合、Pythonエコシステムで最も一般的なものはPostgreSQLです。

注文については、単語名にインデックスを付けたテーブルを作成してください(単語を主キーとして使用すると自動的に実行されます)。を使用してdjangoでレコードを取得してください。

ここdjango field options上のいくつかの情報(primary_key=Trueをご確認ください)

そして、ここではorder_byorder_by method

のための情報ですが、あなたもモデルのMetaクラスの順序を設定することができますに注意してくださいます。

検索の場合、startswithでデータベースにクエリを実行できるエンドポイントを実装する必要があります。あなたの2番目の質問で

class Word(models.Model): 
    word = models.CharField(max_length=255, primary_key=True) 
    roots = ... 
    picture = ... 

:あなたは一例にhere

例のモデルを確認することができます "このコストがかかりますか?" それは本当に依存しています。 4000ワードで私は言うでしょう:NO

とにかくクエリを実行するためにクライアントに遅延を追加することをお勧めします(たとえば、「ユーザーが入力した後、500msが入力なしで渡された場合など) ) 最初の開発者に1つの良いアドバイスを提供したい場合は、は早すぎるものを最適化しないでください

+0

最大で、私は4000語で作業し、それぞれに関連する多くの情報を得ます。だからあなたは、単語をクエリにstartswithを使用して私の問題のために十分に速くなると思いますか?それはよさそうだと私はそれについて読むでしょう。 –

+1

はい、 '4000'はpostgresの微風です – Alvaro

+0

また、効率的にしたいのであれば、ツリーやトライのようなものを実装して特定のブランチだけを検索すればいいですか? startswithを使って、オートコンプリートのtexteditを想定しているので、すべてのタイプされた文字の後ろのすべての単語を検索します。また注文は今必要ではないでしょうか?私はそれを照会し、順序付けは照会プロセスに影響を与えるべきではないからです。 –

関連する問題