1

私はデータベース設計に比較的慣れていません。次のデザインのデータベースがあります

次のようにSQLでテーブルを指定しました。

CREATE TABLE Piece
(identifier INT NOT NULL Unique,
 value      INT NOT NULL,
 the date it was acquited DATE,
 the date it was made DATE,
 PRIMARY KEY (identifier));

CREATE TABLE Person
(name VARCHAR(50),
 person_id INT NOT NULL Unique,
 biography VARCHAR (50),
 date of birth DATE,
 date of death DATE,
 PRIMARY KEY (person_id));

CREATE TABLE Jewel
(code INT NOT NULL Unique,
 gem type VARCHAR (50),
 weight INT,
 quality VARCHAR (50),
 color VARCHAR (50),
 description VARCHAR (50),
 PRIMARY KEY (code));

CREATE TABLE Gem
(type VARCHAR (50) NOT NULL,
 hardness INT,
 density  INT,
 FOREIGN KEY (type) references JEWEL(gem type));

CREATE TABLE Ownership
(person VARCHAR (50),
 piece  INT,
 start of ownership DATE,
 end of ownership   DATE,
 FOREIGN KEY (person) references PERSON(person_id),
 FOREIGN KEY (piece) references PIECE(identifier)); 

私の質問は

1.) 3 つの属性すべてが一意ではないため、GEM テーブルに主キーを指定するにはどうすればよいですか?

2.) person テーブルで person_id 属性を使用して一意にし、それを主キーとして使用しました。余分な属性を追加せずに person テーブルの主キーを作成する別の方法はありますか?既存の属性をUNIQUEにする

3.) すべての整合性制約とデータ型は正しいですか? 私のデザインに何らかの欠陥がありますか?

4

1 に答える 1

2

1)はい、複数列の主キー(複合主キー)を作成できますが、一意になります。このような何かがそれを行う必要があります:

CREATE TABLE Gem
(type VARCHAR (50) NOT NULL,
 hardness INT,
 density  INT,
 PRIMARY KEY (type , hardness, density ),
 FOREIGN KEY (type) references JEWEL(gem type));

2)Personテーブルの主キーを作成する方法は他にもありますが、お勧めしません。Person_idは、ここで使用するものです。

3)私はあなたのデザインに以下の変更を加えます:

  • 所有権テーブルのPersonをVARCHARではなくintにします。それがへの外部キーである場合person_id、それをVARCHARにする必要はありません。
  • Gemテーブルにint識別子を追加します。 GemTypeIdか何か。
  • gem typeジュエルテーブルで、列を新しい列に置き換えGemTypeIdます。

もっとあるかもしれませんが、これらは私に飛び出したものでした。

データを表すためにIDを使用しないようにしようとしているようです。これには理由がありますか?この道を進み続けると、データの整合性の問題が発生する可能性があります。

于 2011-09-14T15:48:55.410 に答える