2010-04-05 157 views
2

所以我有一个有几个表的数据库。管理外键

第一个表包含用户ID,姓氏和名字。

第二个表包含用户ID,ID的兴趣和利益的评价。

有具有所有利益的ID的另一个表。

对于每一个感兴趣的ID(添加新的甚至当),我需要确保每个用户都有为该权益ID的条目(即使它的空白,或有默认值)。

外键是否有助于此场景?或者当我添加新密钥时,是否需要使用PHP更新每条记录?

回答

0

对于每一个感兴趣的ID(添加新 者甚至当),我需要确保 每个用户都有为 兴趣ID的条目(即使其空白,或者已经 默认值)。

这听起来像你在查询中的一个,而不是需要一个OUTER JOIN(无论是LEFTRIGHT)。

例如,如果你想获得的感兴趣程度的特定的人有每个利益:

假设你的表是这样的:
用户:
USER_ID PK
用户

user_interests:
user_id PK FK
interest_id PK FK
interest_level

利益:
interest_id PK
兴趣

SELECT i.interest, ui.interest_level 
FROM interests i 
INNER JOIN user_interests ui USING (interest_id) 
LEFT JOIN users u USING (user_id) 
WHERE user_id = ? 

?是一个占位符。

请注意,ui.interest_level对于没有数据的利益将为空。

1

外键是一种约束,所以他们只能在失败当您尝试添加记录。

您可以使用触发器完成您所描述的内容。我不知道MySQL的语法,但在SQL Server会是这个样子:

CREATE TRIGGER TR_ensure_user_interest ON interest FOR INSERT, UPDATE AS 
BEGIN 
    INSERT user_interest (user_id, interest_id) 
    SELECT user_id, interest_id 
     FROM inserted 
      ,user 
    EXCEPT (SELECT user_id, interest_id) 
END 

请注意,这是一个相当低效率的方法,但它应该包括很多你担心的情况下。

更新:我同意其他谁在这里观察过设计“气味”。如果您可以使用JOIN查询完成所需的结果,那将是一个更有效的解决方案。但是,我试图回答实际问到的问题。 (另外,我一直在这种情况下,在物理记录是有帮助的其他数据库用户谁不擅长复合查询。)

+0

感谢您花时间回答我的问题。这很好理解,但我认为我实际上正在寻找与OMG Unicorns提供的内容相符的东西。我认为触发器最终会造成太多的开销。 – jwzk 2010-04-05 16:29:42

0

这听起来像你,迫使你的物理设计得太紧镜像您的逻辑设计。

也许这将是为什么你需要插入一行在物理表中的每个用户一个好主意,重新考虑究竟。如果给定用户没有关联的兴趣ID,那么您是否可以只编写查询来假设兴趣ID的默认值?

0

“外键是否有助于此场景?”

编号

您的约束是一种“完整性”约束。这意味着对于添加的每个新兴趣,必须将有多少行添加到USER_INTEREST表中,因为有用户。

没有SQL系统能够为您执行。您需要通过代码来执行它。