MySQL创建表一对多,下面的最佳选择是什么?

时间:2019-03-20 03:35:56

标签: mysql sql relational-database

我有以下数据,并使用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,会有任何问题吗?

2 个答案:

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