关系数据库设计,一对多范式

时间:2017-06-01 16:04:30

标签: database-design relational-database one-to-many one-to-one

我正在开发一个即时消息Web应用程序,我决定使用MySQL来存储我的模型。但是当遇到ORM持久性时,我有点困惑。

说我有两个型号,用户和消息。消息有两个与用户,发送者和接收者相关的属性。用户可以发送多条消息,而消息只能有一个发送者和一个接收者。

我的问题:

  1. 根据this,一对多意味着
  2.   

    表A中的一行可以与表B中的许多行链接,但表B中的一行仅链接到表A中的一行

    在我的情况下,User to Message是一对多的关系?我的意思是,消息行链接到用户表中的两行。

    1. 如果这不是一对多关系,那么用户和消息之间最合适的实际关系是什么?

3 个答案:

答案 0 :(得分:2)

在ER建模中,关系/关联在实体上。在关系模型中,关系/关联是在值上。 (许多所谓的ER图实际上并不显示实体和关系,而是显示他们的表格。)

二元关系有基数。表格代表一种关系。例如关系已发送(发件人,邮件)“用户发件人已发送邮件邮件”。这是1对多,因为其中的每个发件人都与其中的一个或多个邮件配对。例如,关系Received(发送者,消息)“user receiver 收到消息消息”。这是1对多,因为其中的每个接收器与其中的一个或多个消息配对。有时一种关系可以用其他关系来表达。例如,您有关系消息(发件人,消息,接收者)“用户发件人向用户接收者发送消息消息 ”;它是已发送(发件人,邮件)和已收到(发件人,邮件)。它是非二进制的;它没有二进制基数;它具有与之相关的其他两个二元关系/基数。

例如:对于“用户到消息”,其中“消息行链接到用户表中的两行”,您似乎表示涉及用户的参与(消息,用户)“消息” EM>用户”。就前两个关系而言,这是发送(用户,消息)或已接收(用户,消息)。就三元关系而言,它是“FORSOME接收者,发送者(Message3(用户,消息,接收者)或Message3(发送者,消息,用户))”。它是1到2,因为其中的每条消息都与其中的2个用户配对。

表(基本变量或查询结果)包含满足其关系的行。基表的行由其名称的查询返回。诸如AND,OR,FORSOME,renaming等关系构建器获取由JOIN,UNION,PROJECT,RENAME等关系运算符计算的行。例如,Involved由关系表达式按照其上面的第一个谓词表达式计算( RENAME sender \ user已发送)UNION(RENAME receiver \ user Received)。 Is there any rule of thumb to construct SQL query from a human-readable description?

FK(外键)约束得到称为“关系”。 (但他们不是。)他们也被称为“链接”。每个都与通过其源表和目标表的关系表达的语句相关联。 FK是从表列列表到形成CK(候选键)的表列列表。它说第一个中的值出现在第二个中。当一个值满足源表的关系然后它满足目标表的关系时,就会发生这种情况。例如,如果发件人消息发送到接收器,则发件人是用户,而发件人< / em>是用户;所以用户有两个相应的FK,一个从{sender}到用户,一个从{receiver}到用户。从第一个表到第二个表的FK是多对一的。 (每个表格和列表中某种关系的基数。)

有很多方法可以讨论基数。 (例如,“0-or-1”到任何地方。例如,看这里与外观相比。)当存在非二元关系时,存在表达基数的通用方法。 (例如,1到M到N.)方法以不同的方式考虑SQL NULL基数0。与表格一样,这些都基于上面的二元关系案例。术语取决于您使用的建模/图表方法/产品/样式。了解你的。

查找一些学术教科书/演示文稿/课程。关于实体 - 关系建模的维基百科条目目前还不错。它解决了变体方法所体现的一些混淆/误解。不幸的是,大多数维基百科的关系模型参考都很差。

PS我没有使用“模型”,因为有时它意味着类,类型,记录,表,行,实体或关系。你必须弄清楚有人说的是什么。如果你使用它,你必须弄清楚你在说什么。

答案 1 :(得分:1)

我认为您的域名是:

  

用户可以发送许多消息。

     

用户可以收到许多消息。

     

邮件只有一个发件人。

     

邮件只有一个收件人。

因此,&#34; message&#34;中有两个一对多的关系。到&#34;用户&#34; - 一个用于发送者,一个用于接收者。

答案 2 :(得分:0)

关系是1对1,1对多或多对多,而不是TABLE。

Message和User表之间有两个关系:sender和receiver。每个关系是1对多。有这两种关系的事实并没有改变这一点。