我想用下表设计一个MySQL数据库:people,每人一个记录,一个id索引shirts,带有id索引,每个衬衫属于一个人,由people_id字段指定,我们可以在该字段上设置与第一个表的关系pants,带有id索引,每个衬衫属于一个人,由people_id字段指定,我们可以在该字段上设置与第一个表的关系然后,在其他表中,给定其people_id,shirt_id和pants_id,每条记录均指穿着完整的人。 people_id不是严格必需的,因为我们可以通过寻找衣服的所有者来找到它。但是,对于每条记录,shirt_id和pants_id的所有者必须相同,我们不希望任何人借衣服。我们可以使用复杂的关系语法来强制执行此关系吗?还是有更好的结构?谢谢! 最佳答案 假设一个人可以拥有多件衣服(一件以上的衬衫,一件以上的裤子),那么您所描述的并不是一个复杂的关系,而是一对多的关系。通过使用一个表(人表)的主键作为其他表中的外键来创建这些键。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表中的ONE行,但是people表中的任何行在shirts或表。给定一条ID为'5'的裤子,您可以通过以下查询找到它们的主人:SELECT people.* FROM people INNER JOIN pants ON pants.people_id = people.id WHERE pants.id = 5;同样,如果您想查找属于ID 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,因为即使该人没有裤子,衬衫或两者都不穿,我们希望它返回值。另一方面,如果每个人只能拥有一件衬衫和一条裤子,而您仍然希望将它们保留在自己的表中,则可以保留上述表结构,并对两个pants约束>和UNIQUE表。
08-19 15:05