2011-06-21 7 views
1

データベース側では、インデックスのパフォーマンス上の問題を引き起こす可能性がある、非常に長くない限り、自然な主キーが望ましいと判断します。私は一つの値だけを格納する予定とタグのように、単純なクラスを持っている場合はsqlalchemyモデルに代理キー(id = 1)または自然な主キー(tag = 'sqlalchemy')を使用する必要がありますか?

class MyClass(Base): 
    __tablename__ = 'myclass' 
    id = Column(Integer, primary_key=True) 

:私はGoogleのコード検索を経由してSQLAlchemyのを使用するプロジェクトを通じて読んでいるようしかし、私はほとんどいつものようなものを見つけますとにかく一意性が必要な場合、私はsqlalchemyを使用しているときに代理の主キーを使って何を得るのですか?私が読んでいるSQLブックの1つは、ORMが「反パターン」の正当な使用であることを示唆していますが、ORMはActiveRecordやDjangoのように思います。これは私のモデルにいくつかの場所をアップしますが、ここでは一つだ:私の広い、リレーショナルモデルでは

class Tag(Base): 
    __tablename__ = 'tag' 
    id = Column(Integer, primary_key=True) #should I drop this and add primary_key to Tag.tag? 
    tag = Column(Unicode(25), unique=True) 
    .... 

、タグは、他のオブジェクトと複数の多対多の関係を持っています。したがって、長いキーを格納する必要のある中間テーブルがいくつかあります。プライマリキーのタグまたはIDを選択する必要がありますか?

+1

私は個人的には自然主キーを使用すると思います。 OTOH、私はSQLの専門家ではなく、すべての長所と短所を適切に検討することはできません。あまりにも私のバイアスであるが、自然キーを使用すると、このフレームワークでは、このような稀な選択のように思えるので、私はフレームワークが持つ自然の相互作用の大部分を維持するために表示され、特に以来、それはあるかもしれない理由として、いくつかのコンテキストを希望 – nothrow

+0

データベース。 – Profane

答えて

3

ORMやプログラミング言語では、ある用途が他のものよりも簡単になりますが、主キーの選択はORMとは無関係のデータベース設計上の問題です。それ自身の根拠に基づいてデータベーススキーマを取得することが重要です。データベースは、とにかくアクセスするコードより長く生きる傾向があります。

検索SO(とGoogle)主キーを選択した方法について、より一般的な質問のために、例えば:https://stackoverflow.com/search?q=primary+key+natural+surrogate+database-designSurrogate vs. natural/business keysは、Relational database design question - Surrogate-key or Natural-key?When not to use surrogate primary keys?、...)私は仮定


Tagの表は、されないこと非常に大きいか非常に動的です。現実世界のデータの下

  • パフォーマンスの低下(この場合Iで は、エンドユーザーに主キー、例えば目に見えない、いくつかのを追加するための重要な理由がない限り、主キーとしてtagを使用しようとします測定し、

  • 目に見えない、、)タグ名の

  • 頻繁な変更を想像していない(が、その後、私はまだキーとして最初に使用されるタグ名)に基づいて、いくつかのユニークな文字列を使用したいですタグのマージ・シーンのビハインド(しかし、前のポイントを参照してください)、

  • 異なる照合順序に問題 - 国際データを比較する - あなたのRDBMSで(しかし、...)

  • ...一般的に


私は人々が両方の方向に誤る傾向にあることが観察さ:

  • (特定のフィールドは、それ自体不透明な数字です)、複雑なマルチフィールド「自然」キーを使用して、テーブルの行は、独自のアイデンティティを持っており、すべてのためにランダムな数値コードを導入するのではなく、意味のある短い使用することによって、自分の代理のIDを持っていることから

  • に利益をもたらすだろうというとき文字列。

意味のある主キー値は、可能であれば、手作業でデータベースを参照する際に役立ちます。あなたはあなたのデータを把握するために複数の結合を必要としません。

+0

私はあなたのコメントを感謝し、もちろん、大きなアドバイスを認識します。 ORM以外の世界でも、代理キーを避けることによって誤っているというあなたの考えは、私には新しくて役に立ちます。私のORMは問題ではないということをあなたは理解しています。しかし、私は、この点のSQLAlchemyの固有の確認、およびそのフレームワーク(どちらかといえば)で得られたか、失われたものを、特に良いアイデアのために期待しています。にもかかわらず、このようなエレガントな一般的な指導を提供してくれてありがとう。 – Profane

+0

@Profane:代理キーを避けるためのアドバイスはしていません。これが正しい選択である場合はたくさんあります。私が意味することは、ORMの作成者が実装しやすいもの(連続番号またはGUID)を探すのではなく、優れたデータベース設計であることを探すことです。それでは、長期的には本当に重要な議論を重み付けすることができます。 –

+0

ええ、私はあなたを追跡していた、明らかに自分自身を明確に表現してはいけません。思慮深い意見をお寄せいただきありがとうございます。私はあなたの答えを受け入れています。なぜなら、それは他の人にとって最も網羅的で、潜在的に有用であるからです。私は、誰かが宣言的なsqlalchemyで自然なキーを使用したところをたどることができる何かを見つけるためにGoogleのコードを見続ける必要があります。ありがとう – Profane

1

私は個人的にはほとんどの場所で代理キーを使用します。 2つの最大の理由は、1)整数キーは一般的により小さい/より速く、2)更新データはカスケードを必要としないことです。その第2のポイントは、あなたがやっていることにとって非常に重要なものです。タグテーブルを参照している多対多テーブルが複数ある場合は、ある人がタグを更新したい場合(スペル/大文字小文字の誤りを修正するなど)、更新プログラムは同時にすべてのテーブルで実行する必要があります。

ナチュラルキーを決して使用してはいけないと言っているわけではありません - ナチュラルキーが決して変更されないことが確かな場合は、ナチュラルキーを考慮します。ただ確実にしなければ、それは維持する痛みになります。

+0

有用な逆視点(上記の自然キーのアドバイスとは対照的)に感謝します。おそらく、これがプライマリキーの「id」でこれらのモデルの多くを見る主な理由です。 sqlalchemyの内部の仕組みを理解している人が、フレームワーク固有の文脈で重要かどうかを洞察することができます。入力してくれてありがとう。 – Profane

0

私は代理キーを使用して(以上)の人を見るたびに、私はこのトピックに関するロイハンのブログ記事、特に第二と第三の記事を覚えている:

これらの記事のように数十年を費やしてきた人から来て、私は強く、人々はそれらを読んで示唆データベースの専門家。それが属したところ、人々は両方、文字通りすべてのためにXMLを使用し、それがどこに属していなかったとき

今日では代理キーの使用は、21世紀の初頭のことを思い出します。

関連する問題