我正在开发一个即时消息Web应用程序,我决定使用MySQL来存储我的模型。但是当遇到ORM持久性时,我有点困惑。
说我有两个型号,用户和消息。消息有两个与用户,发送者和接收者相关的属性。用户可以发送多条消息,而消息只能有一个发送者和一个接收者。
我的问题:
表A中的一行可以与表B中的许多行链接,但表B中的一行仅链接到表A中的一行
在我的情况下,User to Message是一对多的关系?我的意思是,消息行链接到用户表中的两行。
答案 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对多。有这两种关系的事实并没有改变这一点。