2017-06-08 11 views
6

Django 1.11ではデータベースインデックスを作成する新しい方法が提供されています。これまでは、各分野でのdb_index=Trueを持っていた:Django 1.11のデータベースインデックス:db_true、indexes、およびindex_togetherの違い

# example 1 

class Person(models.Model): 
    name = models.CharField(db_index=True) 
    age = models.IntegerField(db_index=True) 

今、私たちはmodels.Indexclass Metaブロック内indexesを宣言する可能性がある - あるいはindex_togetherを。

1.例1からのコードは、以下の例2と同じことをやっている:私は2つの疑問を持っていると述べた

# example 2 

class Person(models.Model): 
    name = models.CharField() 
    age = models.IntegerField() 

    class Meta: 
     indexes = [ 
      models.Index(fields=['name']), 
      models.Index(fields=['age']) 
     ] 

2.どのような複数のフィールドとindex_togetherindexについて:まったく同じことをやって、以下の例3および4はありますか?

# example 3 

class Person(models.Model): 
    name = models.CharField() 
    age = models.IntegerField() 

    class Meta: 
     indexes = [ 
      models.Index(fields=['name', 'age']) 
     ] 
# example 4 

class Person(models.Model): 
    name = models.CharField() 
    age = models.IntegerField() 

    class Meta: 
     index_together = [['name', 'age']] 

1と2の間diferences、及び3と4の違いは何ですか?私は何が欠けていますか?どうもありがとう。

答えて

3

ドキュメントによれば、インデックスに名前を付けることができ、インデックス内の各フィールドの順序を設定できます(しかし、すべてのDBが同じようにサポートされるわけではありません)。 しかし、現実には、サポートされている場合は他のタイプのインデックスを定義するために余分な柔軟性を持たせることがポイントです。

現在、Django 1.11以降、Postgresを使用している場合にのみ、GINインデックスとBRINインデックスを定義することができます。 (django.contrib.postgres.indexes at https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/

上記のようにインデックスを定義できることは最も一般的なケースであり、上記の機能(ネーミングインデックスまたはオーダリングフィールド)を使用しない限り、これまで行ってきたようにインデックスを使用します(db_indexとindex_together)。

+0

例1から例2に変更して 'makemigrations'を実行すると、Djangoは以前のすべてのインデックスをダンプして再作成します。これは期待されますか?どうして? – cuducos

+1

私はそれについて少し分かりませんが、Djangoは同じことを達成してもそれらの機能がどのように関連しているか分かりません。 マイグレーションが計算されているとき、Djangoは 'db_index = True'か' index_together'を削除したことに気付きます。これはインデックスの削除を意味します。同時に、Djangoはあなたが 'idexes'を追加したことに気づき、それを作成します。それはちょうど互いを関連付けることができないようです。 これを行うことで再作成される大量のインデックスがない限り、これは問題にはなりません。特定のケースを評価する必要があります。 –

+1

新しい 'indexes'機能は単に' db_index'と 'index_together'を一般化しているので、驚いています。彼らは新しいものにそれらを扱う古典的な方法を翻訳して、Djangoに同等であることを伝えるいくつかのチェックを追加することができました。私はなぜ彼らがこのようにそれらを処理しないという決定をしたのか分からないいくつかの余分な技術的な理由があると思います。他の誰かがここで光を当てるかもしれない。 –

関連する問題