如何组织数据库中的相关表

时间:2011-08-09 12:56:16

标签: database database-design join relational-database

我有以下情况:

table User (id, name)
table Belonging (id, name, color)
table UserBelonging (id, user_id, belonging_id)

现在,UserBelonging是连接User和他的Belonging的联接表。

当我想要提取某些User的所有物品时会出现问题,这些物品是红色的。

我认为有两种方法可以做到:

  1. 为某个用户获取所有UserBelonging,然后循环浏览它们并检查哪些是红色的
  2. 添加一个额外的列:UserBelonging (id, user_id, belonging_id, color),然后在同一个表中查询。
  3. 这两种方法对我来说都很难看。是否有任何有数据库表经验的人可以告诉我哪种方式更好,为什么或可能给我一个更好的解决方案?

    感谢

4 个答案:

答案 0 :(得分:1)

联接表应包含user_idbelonging_id,其复合ID为(user_id, belonging_id)或自动递增id列。< / p>

排除了#2。


现在,您可以使用策略#1,或者您可以在select语句中过滤掉非红色物品。

SELECT b.id, b.name, b.color
FROM UserBelonging ub
LEFT JOIN Belonging b
ON ub.belonging_id = b.id
WHERE ub.user_id = 123456789
AND b.color = 'red'

答案 1 :(得分:1)

SELECT B.* FROM User U
INNER JOIN UserBelonging UB on UB.UserId=U.Id
INNER JOIN Belonging B on B.Id = UB.BelongingId
Where B.Color = 'red' AND U.Name='Sam'

我认为像这样的联盟会做你想做的事。

答案 2 :(得分:0)

您可以轻松地将1 JOIN和A WHERE语句与您的颜色条件和user_id一起使用。在讨论关系数据库时,联接是最常见的操作之一。 查看W3schools以获取一些基本示例。

答案 3 :(得分:0)

通常最好不要在数据库中使用循环。在SQL Server中,我会这样做(但我不知道它是否适用于您的数据库)

    Select User.Name, Belonging.name, Belonging.color from User inner join UserBelonging 
    on User.id =     UserBelonging.user_id inner join Belonging 
    on UserBelonging.belonging_id = Belonging.id 
    where Belonging.color = 'red' and User.name = 'put the name here'

问候