在 Person 和 User 之间实现一对一 (1:1) 的关系

lau*_*kok 5 mysql database-design entity-framework mysql-5.5 subtypes

场景描述

我将此person表作为超级父级(或超类型),

id
firstname
lastname
email
telephone
...
...
Run Code Online (Sandbox Code Playgroud)

user表作为孩子(或子类型)

id
person_id (FK)
password
username
screenname
...
... 
Run Code Online (Sandbox Code Playgroud)

它们必须是一对一 ( 1:1 ) 的关系,因为用户不能重复两次,因此给定人员行中的特定电子邮件值不能重复两次。

然后我有这张message表,它存储来自任何人的消息

id
firstname
lastname
email
telephone
subject
content
...
...
Run Code Online (Sandbox Code Playgroud)

但可以看到的是firstnamelastnameemailtelephone复制message表。

所以,我想把它参考person下面的表格,

id
person_id
subject
content
...
Run Code Online (Sandbox Code Playgroud)

但随后似乎并不正确,因为一个具有相同的电子邮件名称等可以发送邮件给我很多次他们想要的,所以细节他/提供可重复她。

问题

  • 那么,我应该message作为person父母的孩子还是他们应该是独立的实体?

  • 或者,有没有更好的建议来解决这个问题?

ype*_*eᵀᴹ 5

我有一张person桌子。

很好(只是更改了PK列的名称):

person
------
person_id    PK
firstname
lastname
email
telephone
...
...
Run Code Online (Sandbox Code Playgroud)

和作为孩子的用户表。它们必须是 1:1 的关系,因为一个用户不能重复两次。

如果关系是 1:1(假设它person是 supertpe 并且user是子类型,您可以使用与主键和外键相同的列来处理这个问题person

user
----
person_id  PK  FK to person(person_id)
password
username
screenname
...
... 
Run Code Online (Sandbox Code Playgroud)

因此 person 行中的电子邮件不得重复两次。

UNIQUEperson.email列中添加约束。

然后我有这个消息表,它存储来自任何人的消息,但您可以看到名字、姓氏、电子邮件、电话在消息表中重复。所以我想把它引用到像下面这样的人表。

很好(根据之前的更改进行了调整)。但是您还需要存储谁发送消息以及谁是接收者:

message
-------
message_id   PK
sender_id    FK  to user(person_id)         --- or to person(person_id)
receiver_id  FK  to user(person_id)         --- that depends on your requirements
subject
content
...
Run Code Online (Sandbox Code Playgroud)