我正在构建一个聊天系统的后端,我有一个Message
表,看起来像这样:
问题是我需要2个外键指向同一个表ID。
没问题,但是在这种情况下,用户发送了多条消息,数据库说
违反了唯一约束
示例:
13 Testmessage1 01.06.17 08:15:01,456554000 2 (sender_id) 23 (receiver_id)
14 Testmessage2 01.06.17 07:09:08,517000000 2 (sender_id) 23 (receiver_id)
最后两个标识符是用户ID,它们都是相同的!
我该如何处理?
答案 0 :(得分:1)
解决了问题 我查看了我的Constraints,我看到,我已经结合了我的Django模型中的独特约束。我删除了它,并迁移了我的数据库,现在我可以创建多个消息。谢谢你的回答!
答案 1 :(得分:0)
设计对我来说似乎很好,但是你在Messages
表上定义的键应该是不同的。用户X多次向用户Y发送消息非常好,所以我看到两个选项供您定义密钥:
sender_id
/ receiver_id
/ gendate
:不应该同时发送同一用户和同一用户的两条消息ID
:您已经提供代理密钥,可以使用编辑(进一步解释)
定义表时,还可以在其上定义唯一性约束。
假设您的表格中有一个唯一的键定义为(sender_id
,receiver_id
);有了它,你告诉dbms"嘿,不要让我插入两条具有相同sender_id
和receiver_id
值的消息,因为那些是我的标准想用来唯一地识别一行"。这样,无论何时选择发件人和收件人,您都确定只会收到一封邮件。
如果表中有一个值为2和23的行,则尝试插入另一个具有相同值的行会导致该错误消息。
我的第一个选项是,如果您更改该唯一键而不是包含gendate
,则dbms将向您保证不会有两行具有相同的sender_id
,{{ 1}}和receiver_id
值。导致错误的行将被视为不同。
第二个选项是,如果您的唯一键是gendate
,您甚至可以在同一个用户之间同时拥有多条消息,只要您为每行生成不同的ID
值即可你插入。
答案 2 :(得分:0)
关键是不要违反唯一性约束,我认为问题不在这里,你需要提供一个完整的表结构,我不明白一件事,为什么我们要设置一个外键,我想这会降低系统的灵活性和可维护性,增加开发的一点难度,我认为我们应该摆脱外键。