2011-09-14 8 views
1

私はデータベース設計に比較的新しいです。私は次のデザインを持つデータベースを持っています問題SQLでテーブルを指定する

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)); 

私の質問は、すべての3つの属性が一意でないと、私はGEM_IDのような新しい属性を作成する必要がありますどのように私は私のように、GEMのテーブルに主キーを指定することができます)

1です。既存の属性を使用し、新しい属性を追加しないことをお勧めします。

2)personテーブルのperson_id属性をユニークにしてプライマリキーとして使用しましたが、別の属性を追加せずにpersonテーブルのプライマリキーを作成する別の方法はありますか?既存の属性に制約を含めてユニークにする

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

+0

この宿題はありますか?どのRDBMSを使用していますか? – Vache

+0

Microsoft SQL Serverを使用しています。私のschlのウェブサイトプロジェクトのためのそのデザイン –

答えて

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)私はあなたのデザインを次のように変更します:

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

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

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

+0

返信いただきありがとうございます。はい、私はすべてのテーブルのIDを維持することが良いデザインであり、自動インクリメントにすることを知っている、私はちょうど宝石のユニークなタイプを作ることが良いアイデアは、 。 –

+0

宝石の種類が一意である必要がある場合は、型列に宝石表の一意の制約を与えます。私はまだすべてのint IDを使用します。 –

+0

"データの整合性の問題が発生する可能性があります" - サロゲートキーを使用するフォークのデータ整合性の問題が増えています。 – onedaywhen

関連する問題