复杂的SQL关系

时间:2015-04-08 13:08:28

标签: mysql sql relational-database

我想用下表设计一个MySQL数据库:

  • people,每人一条记录,id索引
  • shirts,带有id索引,每个衬衫属于一个人,由people_id字段给出,我们可以在其上设置与第一个表的关系
  • pants,带有id索引,每个衬衫属于一个人,由people_id字段给出,我们可以在其上设置与第一个表的关系

然后,在其他一些表中,每个记录都指的是一个完全穿着的人,给定people_idshirt_idpants_idpeople_id并非绝对必要,因为我们可以通过寻找衣服的主人来找到它。

但是,对于每条记录,shirt_idpants_id的所有者必须相同,我们不希望任何人借衣服。

我们可以使用复杂的关系语法强制执行此关系吗?还是有更好的结构?

谢谢!

2 个答案:

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

使用此结构,shirtspants表中的任何行只能属于people表中的一行,但people表中的任何行都可能在shirtspants表中有许多相应的条目。

如果有一条带有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在pantsshirts表中。

答案 1 :(得分:0)

如果具体pants_id必须只属于一个人,那么shirt_id我认为创建两个UNIQUE索引:首先在pants_id上,第二个仅在shirt_id应该为您提供所需的结果(这将确保在表格中只有一条记录包含每个特定的ID)。

希望它有所帮助。