我想用下表设计一个MySQL数据库:
people
,每人一条记录,id
索引shirts
,带有id
索引,每个衬衫属于一个人,由people_id
字段给出,我们可以在其上设置与第一个表的关系pants
,带有id
索引,每个衬衫属于一个人,由people_id
字段给出,我们可以在其上设置与第一个表的关系然后,在其他一些表中,每个记录都指的是一个完全穿着的人,给定people_id
,shirt_id
和pants_id
。 people_id
并非绝对必要,因为我们可以通过寻找衣服的主人来找到它。
但是,对于每条记录,shirt_id
和pants_id
的所有者必须相同,我们不希望任何人借衣服。
我们可以使用复杂的关系语法强制执行此关系吗?还是有更好的结构?
谢谢!
答案 0 :(得分:1)
假设一个人可以拥有多件衣服(不止一件衬衫,一件以上的裤子),那么你所描述的并不是一个复杂的关系,而只是一对多的关系。您可以使用一个表(person表)的主键作为其他表中的外键来创建它们。
CREATE TABLE people (
id integer primary key auto_increment,
name varchar(25)
);
CREATE TABLE shirts (
id integer primary key auto_increment,
people_id integer,
foreign key (people_id) references people(id)
);
CREATE TABLE pants (
id integer primary key auto_increment,
people_id integer,
foreign key (people_id) references people(id)
);
使用此结构,shirts
或pants
表中的任何行只能属于people
表中的一行,但people
表中的任何行都可能在shirts
或pants
表中有许多相应的条目。
如果有一条带有ID' 5'的裤子,你可以通过以下查询找到他们的主人:
SELECT people.*
FROM people
INNER JOIN pants
ON pants.people_id = people.id
WHERE pants.id = 5;
同样,如果你想找到属于身份7的人的所有衣服,你可以这样做:
SELECT pants.*, shirts.*
FROM people
LEFT JOIN pants
ON pants.people_id = people.id
LEFT JOIN shirts
ON shirts.people_id = people.id
WHERE people.id = 7;
编辑我们在这里使用LEFT JOIN,如下所示,因为我们希望它返回值,即使这个人没有裤子,衬衫或其中任何一个。
如果另一方面,每个人只能有一件衬衫和一条裤子,而你仍然希望将它们保存在自己的表格中,那么你可以保留上面的表格结构并强制执行UNIQUE
约束。 people {id在pants
和shirts
表中。
答案 1 :(得分:0)
如果具体pants_id
必须只属于一个人,那么shirt_id
我认为创建两个UNIQUE
索引:首先在pants_id
上,第二个仅在shirt_id
应该为您提供所需的结果(这将确保在表格中只有一条记录包含每个特定的ID)。
希望它有所帮助。