2017-06-01 145 views
1

我建立一个聊天系统的后端的,我有一个Message表看起来像这样:两个外键引用一个表

enter image description here

的问题是,我需要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

好吧,如果一封邮件可能有多个收件人,您希望为邮件收件人创建一个表,并将其用于邮件和收件人ID之间的多对多关系。 –

+0

消息只有一个收件人,而不是乘法。我有一个用户表。消息表中必须包含用于用户标识的外键。如果发件人向同一用户写入多个邮件,它会带来“违反唯一约束”错误。那就是问题所在!我还将这两个键设置为unique = False。 – Tim

+0

那么你的独特约束是错误的。它不能仅基于发件人和收件人ID,还必须包含其他内容。 –

回答

1

问题解决 我看着我的约束,我看到,我已经结合了我的Django模型中的唯一约束。我删除了它,并迁移了我的数据库,现在我可以创建多个消息。谢谢你的回答!

0

设计对我来说似乎很好,但您在Messages表中定义的关键应该不同。这是完全正常的用户X将消息发送到用户Y多次,所以我看到两个选项供您定义的关键是:

  • sender_id/receiver_id/gendate:它不应该发生,从相同的两个消息用户相同的用户在同一时间被发送
  • ID:你已经提供了代理键,您可以使用

编辑(进一步的解释)

当你定义一个表格时,你也可以定义它的唯一性约束。假设你的表格有一个唯一的键(sender_idreceiver_id);那么,你告诉dbms“嘿,不要让我插入两条具有相同值sender_idreceiver_id的消息,因为这些是我想用来唯一标识一行的标准”。这样,只要你选择一个发件人和一个接收者,你肯定会得到不超过一条消息。

如果您的表中有一行值为2和23,尝试插入另一个具有相同值的行会导致该错误消息。

我的第一个选项是说,如果你改变唯一的密钥也包括gendate相反,DBMS会向你保证,不会有两行具有相同sender_idreceiver_idgendate值。那么导致你的错误的行将被认为是不同的。

第二个选项表示,如果您的唯一密钥为ID,则只要您为插入的每行生成不同的ID值,您甚至可以在同一用户之间同时发送多封邮件。

+0

不是选项1与我具有相同的结构吗? – Tim

+0

表格结构不需要更改,可以选择任一选项;需要改变的是你在其上定义的约束。你当前的密钥可能被定义为('sender_id' /'receiver_id'),我的第一个选项将'gendate'添加到那个;这样,目前违反唯一性约束的两行将是可接受的,因为它们不同于'gendate' –

+0

对不起,但你能给我一个例子吗?我真的不明白你的意思 – Tim

0

关键是不违反唯一性约束,我觉得问题不在这里,你需要提供一个完整的表结构,我不明白一件事,为什么我们必须设置一个外键,我认为这会降低系统的灵活性和可维护性,为开发增加一点难度,我认为我们应该摆脱外键。