我有以下数据,并使用mysql。人名是唯一的,电话号码是每人唯一的。
Person_name1=TelephoneNumber1, TelephoneNumber2, TelephoneNumber3...
Person_name2=TelephoneNumber4, TelephoneNumber5, TelephoneNumber6...
选项1.创建1:许多主表和子表。
CREATE TABLE Person (
personName varchar(50) NOT NULL,
id int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
UNIQUE KEY personName (personName)
);
CREATE TABLE Telephone (
telephoneNumber int,
mappingId int,
PRIMARY KEY (telephoneNumber),
foreign key(mappingId) references Person(id)
);
选项2。创建一个表,其中人员名,电话号码为复合键。
CREATE TABLE
Person_Telephone (
personName varchar(50) NOT NULL,
telephoneNumber int NOT NULL,
PRIMARY KEY(personName, telephoneNumber)
);
选项1是否简化了仅为两个字段创建两个表的工作? 选项2看起来很完美,如果选择选项2而不是选项1,会有任何问题吗?
答案 0 :(得分:3)
选项2为您提供了在每个查询中必须控制的重复人员。
最好是将实体分开,这是经典的1-N关系
答案 1 :(得分:2)
由于用户可以拥有多个电话号码,所以我认为最好使用2张桌子。
CREATE TABLE person (
PRIMARY KEY (id) AUTO_INCREMENT,
person_name VARCHAR(45) NOT NULL,
);
CREATE TABLE phone_number (
PRIMARY KEY (id) AUTO_INCREMENT,
phone_number VARCHAR(11) NOT NULL,
FOREIGN KEY (person_id) REFERENCES person(id)
)
现在,您可以像这样简单地JOIN
表:
SELECT
t1.id,
t1.person_name,
t2.phone_number
FROM person t1
LEFT JOIN phone_number t2
ON (t1.id = t2.person_id);