【问题标题】:Relation database design,one to many paradigm关系数据库设计,一对多范式
【发布时间】:2017-06-01 16:04:29
【问题描述】:

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

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

我的问题:

  1. 根据this,一对多的意思

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

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

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

【问题讨论】:

  • “链接”是从表中的列列表到表中的列列表。不在桌子之间。
  • @philipxy 所以这完全是一对多的关系。发送方列仅对应行,接收方列也是如此。我说得对吗?
  • 我无法理解您的评论。看我的回答。您需要根据表表示的关系或 FK 来讨论。 PS关系不是关系。一张表(关系)代表一种“关系”(意为关联)。链接是“关系”(意思是 FK)。
  • @philipxy 对不起我的英语不好。您在回答中解释的内容有点深奥,但有很大帮助。谢谢!
  • 如果您认为我的回答有助于使其更有帮助,请发表评论。重新“深奥”我希望你会考虑相反它是如何具体和实用的。 (每个段落都有一个精确的例子。)是的,作为关联的“关系”是抽象的,但它是 ER 和关系模型所基于的基本和实用概念。请注意您自己的链接使用具有三种不同含义的“关系”——关联(“关系本身”)、基数和 FK(“链接”),同时声称只给它两个 i> 含义(ER 与数据库)和 混淆 所有三个。 PS编辑了我的答案。

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


【解决方案1】:

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

二元关系具有基数。一张表代表一种关系。例如关系 Sent(sender, message)“用户 sender 发送消息 message”。这是一对多,因为其中的每个发件人都与其中的 1 条或多条消息配对。例如关系Received(sender, message)“用户receiver收到消息message”。这是一对多,因为其中的每个接收器都与其中的 1 个或多个消息配对。有时,一种关系可以用其他关系来表达。例如,您有关系 Message(sender, message, receiver) "user sender sent message message to user receiver";它是 Sent(sender, message) AND Received(sender, message)。它是非二进制的;它没有二元基数;它具有与之关联的其他两个二元关系/基数。

例如:对于“用户到消息”,其中“消息行链接到用户表中的两行”,您似乎是指关系 Involved(message, user) "message 涉及用户 用户”。就前两个关系而言,这是 Sent(user, message) OR Received(user, message)。就三元关系而言,它是“FORSOME 接收者、发送者(Message3(用户、消息、接收者)或 Message3(发送者、消息、用户))”。它是 1 比 2,因为其中的每条消息都与其中的 2 个用户配对。

表(基本变量或查询结果)包含满足其关系的行。基表的行由作为其名称的查询返回。 AND、OR、FORSOME、重命名等关系构建器通过 JOIN、UNION、PROJECT、RENAME 等关系运算符计算其行。例如,Involved 是根据上面的第一个 predicate 表达式通过关系表达式计算的 (重命名发送者\用户已发送)联合(重命名接收者\用户已接收)。 Is there any rule of thumb to construct SQL query from a human-readable description?

FK(外键)约束被称为“关系”。 (但它们不是。)它们也被称为“链接”。每个都与可通过其源表和目标表的关系表达的语句相关联。 FK 是从表格列列表到形成 CK(候选键)的表格列列表。它说第一个中的值出现在第二个中。当一个值满足源表的关系然后它满足目标表的关系时,就会发生这种情况。例如,如果 sendermessage 发送到 receiversender 是用户,而 receiver 是用户;所以有两个对应的 FK 到 User,一个从 {sender} 到 user,一个从 {receiver} 到 user。从第一张桌子到第二张桌子的 FK 是多对一的。 (根据其表和列表的特定关系的基数。)

讨论基数的方式有很多种。 (例如“0-或-1”到任何东西。例如,在这里查看与横向查看。)当存在非二元关系时,有通用的方法来表达基数。 (例如 1 到 M 到 N。)方法以不同的方式解释 SQL NULL 基数 0。就像表格一样,这些都是基于上面的二元关系案例。术语取决于您使用的建模/绘图方法/产品/风格。了解您的。

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

PS 我没有使用“模型”,因为有时它表示类、类型、记录、表、行、实体或关系。你必须弄清楚某人在说什么。用的时候要说清楚自己在说什么。

【讨论】:

    【解决方案2】:

    我认为您的域类似于:

    一个用户可以发送许多消息。

    一个用户可以收到很多消息。

    一封邮件只有一个发件人。

    一封邮件只有一个收件人。

    因此,从“消息”到“用户”有两种一对多关系——一种用于发送者,一种用于接收者。

    【讨论】:

    • 你的意思是 1:many 从用户到消息,many:1 从消息到用户。
    【解决方案3】:

    关系是一对一、一对多或多对多,而不是表。

    Message 和 User 表之间有两种关系:发送者和接收者。每个关系都是一对多的。存在两种关系这一事实并没有改变这一点。

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 2015-08-05
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2011-05-01
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多