问题在SQL中指定表

时间:2011-09-14 15:36:23

标签: sql sql-server create-table

我对数据库设计比较陌生。我有一个具有以下设计的数据库

我在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.。)如何指定GEM表的主键,因为所有3个属性都不是唯一的,我是否必须创建一个像Gem_id这样的新属性,因为我更喜欢使用现有属性而不是添加新属性。

2.。)我在person表中使用了person_id属性使其唯一并将其用作主键,是否有另一种方法为person表创建主键而不添加额外属性,显然我不能包含对现有属性的约束并使其成为UNIQUE

3.。)所有完整性约束和数据类型是否正确?我的设计是否有任何缺陷。

1 个答案:

答案 0 :(得分: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设为int而不是VARCHAR。如果它是person_id的外键,那么您不希望它是VARCHAR。
  • 将一个int标识符添加到Gem表中。 GemTypeId或其他什么。
  • 在宝石表中,将gem type列替换为新的GemTypeId列。

可能会有更多,但这些是跳出来的。

您似乎尝试不使用ID来表示数据。是否有一个原因?如果您继续沿着这条路走下去,可能会遇到数据完整性问题。