【发布时间】:2017-12-03 20:49:39
【问题描述】:
我有 4 张桌子:
users
id integer primary_key
questions
id integer primary_key
asker_id references users(id)
answers
id integer primary_key
question_id references questions(id)
answerer_id references users(id)
notifications
id integer primary_key
answer_id references answers(id)
notified_user_id references users(id)
如何强制执行以下约束:
任何通知中的notified_user_id 必须与该通知中answer_id 引用的问题中的asker_id 相同。
基本上,我想确保我通知提出问题的用户,而不是任何其他用户。
我知道我可以正常化,但我需要 notified_user_id 存在于通知中。
【问题讨论】:
-
既然你坚持让它非规范化,只需在你的应用逻辑中强制执行约束。你不能同时拥有它。
-
"我知道我可以正常化,但我需要 notify_user_id 存在于通知中" 。为什么?为什么不能在运行时使用 select 语句来连接表?您可以对此类事情使用触发器。但这通常表明存在设计问题
-
@Nick.McDermaid 因为我认为加入 4 张桌子很昂贵。
-
比一个比它需要的更复杂的系统的支持开销更昂贵?
-
衡量费用。这将取决于音量。有几百个问题,费用将是微不足道的。面对数十亿个问题,您需要一个非常好的平台。
标签: sql postgresql database-design foreign-keys constraints