2017-01-27 28 views
0

以下の表記スキーマを参照してください。同一の一意の列を持つ表の主キーまたは外部キー

表2は異なるフォーマットのフィルムを含んでいます。例えば。 2D、3D、4D等

表1に私のフィルムID欄は表1のための私の主キーであるように列と終了列は、表1

からフィルムのID番号であるとしてそれはフォーマットを有します、私は表2の映画のIDの列が外来のキーであると信じるように導きます。しかし、これはテーブル2にプライマリキーなしで私の葉を残します。

この場合、プライマリキーなしでテーブル2を離れるか、両方のテーブルの両方のプライマリキーとして両方のフィルムIDを設定するか、別の列を作成することをお勧めします私のテーブル2の主キーとなる "フィルムフォーマットID"を可能にするテーブル2で?視覚的な参考

table 1     table 2           
-------|-------   -------|-------|-------|------- 
Film |film ID   Film ID| 3D | 4D | 2D 
     ^primary key  ^foreign key 
+0

これらの2つのテーブルを分割する理由は何ですか?それらの関係が1対1の場合 –

+0

5dフィルムはどこに保管されていますか? – Strawberry

答えて

0

は表2は、親となって、あなたのテーブル1の子のようなものです。これは、テーブル1がテーブル2なしで存在する可能性があるからです。テーブル2はテーブル1なしではできません。なぜなら、フィルムIDプライマリキーを使用して一連の情報を作成するからです(2dまたは3dフォーマットの非存在フィルムはできません)。

両方のテーブルでフィルムIDをプライマリにすることに関するご質問にお答えします。いいえ、これをしないでください。主キーは、別の表の外部キーで参照できる表のデータ列を一意に識別します。それが表2の主キーであった場合、関係がないため表1のデータを参照しません。

-1

テーブル2にプライマリキーは必要なく、ユニークなインデックスのみが必要です。 しかし、必要に応じて、IDフィールドのような人工キーを使用することができます。この例では、1x1の関係で、私はそれが不要だと思う。

+0

私はそれを外部キーにして、フィルムID列に表2のユニーク制約を追加します。これがベストプラクティスですか? – moglia1

+0

そうだと思います。ただし、この場合は2つのテーブルは必要ありません。あなたは1x1の関係を持っており、最良の方法はそれらのテーブルを結合することだと思います。しかし、それはあなたの決断です。 –

+0

RDBMS内のすべてのテーブルにはPRIMARY KEYが必要です。疑問は、そのキーが自然なキーであるか代理であるべきかだけです。 – Strawberry

0

私はあなたのニーズを理解している場合、あなたはそれらの二つのテーブルを使用することができます:それは間違いだろうように、第2のテーブルにPKをフィルムID作るために、

CREATE TABLE `film` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `film_format` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `film_id` int(11) DEFAULT NULL, 
    `format` enum('2D','3D','4D') CHARACTER SET latin1 DEFAULT '2D', 
    PRIMARY KEY (`id`), 
    KEY `fk` (`film_id`), 
    CONSTRAINT `fk` FOREIGN KEY (`film_id`) REFERENCES `film` (`id`) ON DELETE SET NULL ON UPDATE SET NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+0

私はあなたが映画会社を意味しないと思いますか?これはうまくいきませんが、列挙型が好きではないのですが、テーブルを変更して追加する必要があるからです。私はフィルムタイプの代わりにルックアップテーブルがあることを好みます。 – HLGEM

+0

ff.idは(恐らく)冗長であり、残りの列は複合自然キーを形成することができる。 – Strawberry

+0

@HLGEM私はあなたの懸念を分かち合っていますが、*効率的で、新しいフォーマットはおそらくそれほど多くはありません。 – Strawberry

1

それは多くの映画が複数の形式で来るように私には思えます。さらに、設計は正規化されておらず、欠陥が多い。ルックアップテーブルであるフィルムタイプの3番目のテーブルが必要です。次に、2番目のテーブルにはfilmidとfilmtypeidのみが含まれていて、両方のフィールドの組み合わせにプライマリキーを作成できます。これはジャンクション・テーブルと呼ばれます。

+0

したがって、3つのテーブルがあり、table1にはfilmというフィルムの列があります。次にtableIDはfilmID:filmFormatID、table 3は2D:3D:4D:filmFormatIDです。ここで、FormatIDはすべてのフィルムで異なります。テーブル3のプライマリキー、テーブル2の両方のプライマリキーとテーブル1のfilmIDはプライマリキーですか?これは、データベースが1NFのために正規化されたことを意味しますか? – moglia1

+0

表3は、formatId、format typeです。 2d、3d、4dの列を持つことは決してありません。その中のレコードは2D、3D、4Dの列ではありません – HLGEM

0

テーブルデザインがfirst normal formに違反しているため、問題が発生しています。プライマリと、

表1

映画のリスト:[フィルム、フォーマット]の一意の組合せは、2

私はこの代替を提案することができるテーブルに独自の行に含まれるべきですFilmIDのキー。

表2

膜によってサポートされるフォーマットのリスト。

カラム:フィルムID(FK)のformatID(FK)

主キー:フィルムID +のformatIDのいずれかの化合物のキー、またはsurrogate key

表3

電位のリストフィルムフォーマット

カラム:フォーマットID、フォーマット説明(2D、3Dなど)

主キー:FormatID

関連する問題