2012-01-19 6 views
1

これはプログラミング上の問題であり、設計上の問題です。列のユニークな組み合わせでPKを作成するか、数値のrowIDを追加する

私は小売製品に関する詳細情報を格納するテーブルがあります。

Name Barcode BarcodeFormat etc... 
---------------------------------------- 

(Name, Barcode, BarcodeFormat)は、3つの列が一意にテーブル(候補キー)でレコードを識別しますです。しかし、私はこれにFKが必要な他のテーブルを持っています。だから私はauto_incrementカラムitemIdを導入し、そのPKを作った。

私の質問は - 私は(itemId, Name, Barcode, BarcodeFormat)としてPKを持つべきか、PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat)を持っている方が良いでしょう。

私の主な関心事は、INSERTSELECTの操作に関するパフォーマンスですが、サイズに関するコメントも歓迎します。 PK(品目ID)とUNIQUE(名前、バーコード、BarcodeFormat):

私はmysql間違い

答えて

5

innodbテーブルを使用しています。あなたはすべてのあなたが1日、一意ではありませんバーコードの値なしで行を持っているので、あなたドンも

  • などに参加するためのマルチパートキーを使用しての手間を望んでいない

    • 一意性の制約はビジネスレベルの問題であり、データベースエンティティの問題ではありません。あなたは常にキーが必要ですユニークさのビジネスルールが常に必要というわけではありません。
  • +0

    好きなもの...... –

    +0

    -1「主キー」の選択は任意です。あなたの最後のポイントは特に困惑しています。整合性制約は、ビジネスルールのデータベース内の論理表現でなければなりません。彼らがいないならば、あなたは真剣に何かをやっている! – onedaywhen

    +0

    @onedaywhenあなたは私の意見を完全に忘れてしまった。ユニークなコンビネーションは*ビジネス*中心のコンセプトなので、ビジネスのニーズが変わるたびに**変更される可能性があります**(バーコードなしの完全な合理的な例ではユニークな制約を壊すでしょう)。ただし、主キーの必要性は*パーマネント*であるため、ユニーク制約の必要性が残る可能性があります。両者を分離することで、柔軟性と保守性が向上します。この2つをマージすることで、データベースの要件を現在のビジネス要件にロックすることができます(ビジネスが変わらないことを望みます)。 – Bohemian

    2

    数百万の製品や非常に高いスループットが要求されない限り、パフォーマンス面で大きな違いはありません。

    サロゲートPK(自動インクリメント列、第2の選択肢はPK(itemId)およびUNIQUE(Name, Barcode, BarcodeFormat))は、ビジネスキーが変更された場合に管理しやすいため、お勧めします。

    0

    itemIdを既に追加している場合は、それをPKとして使用し、他の3つの列にUNIQUEを付ける必要があります。

    itemIdがない場合は、他の列をPKとして使用できますが、どこにでも置くことは難しくなります。この場合、それはエンティティであるため、製品にはidが必要なのですばらしいわけではありませんが、関係が単なるものであれば、idカラムを持たないと受け入れられます。

    1

    2つの候補キーがあります。 3列の複合キーを「自然キー」と呼び、auto_increment列(この場合)は「サロゲートキー」と呼びます。どちらの場合も、データベースレベルでユニーク制約(論理的には小文字で「一意」)が必要です。任意選択で、1つの候補キーが「プライマリ」と指定されてもよい。どのキー(もしあれば)がこの指定を取得すべきかの選択は任意である。あなたにこの問題に関する決定的なアドバイスを与える人には注意してください!

    関連する問題