我对数据库设计比较陌生。我有一个具有以下设计的数据库
我在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.。)所有完整性约束和数据类型是否正确?我的设计是否有任何缺陷。
答案 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_id
的外键,那么您不希望它是VARCHAR。GemTypeId
或其他什么。gem type
列替换为新的GemTypeId
列。可能会有更多,但这些是跳出来的。
您似乎尝试不使用ID来表示数据。是否有一个原因?如果您继续沿着这条路走下去,可能会遇到数据完整性问题。