【问题标题】:How to link multiple rows within a single table - MySql如何链接单个表中的多行 - MySql
【发布时间】:2019-05-23 08:09:35
【问题描述】:

我正在研究如何在一个表中链接多行。

简而言之,这是一个用户可以添加消息的系统。消息链接到一个部门。用户可以一次向多个部门发布消息。

消息多次存储在消息表中。因此,当我将消息发送到 3 个部门时,它会在消息表中创建 3 行。 这样做的原因是因为每个部门的用户都可以评论消息。在不同的赛区,cmets也会有所不同。

收到了一个新请求,以便能够链接这些消息。为了简单起见,我可以将一条消息标记为“完成”。当这条消息在‘a’区被标记为‘done’时,‘b’和‘c’区的其他消息(另外两行)也需要得到这个标记。

目前我对如何以一种好的方式做到这一点一无所知。 我有创建一个包含消息 ID 的额外表的想法,但仍然不确定如何从中获取所有链接的消息。

我想到了一条作为“父母”的信息。然后在每次更改时搜索孩子和父母的消息。但这感觉不是一个好的解决方案。

真的很期待一些建议来帮助我朝着正确的方向前进!

【问题讨论】:

  • 如果消息是相同的并且总是(在所有部门中),那么为这些消息设置一个单独的表可能更有意义。给他们每个人一个唯一的 id,可以存储原始表并用于引用消息。这将是一种更好的规范化数据库管理方法,可以消除将可能较大的文本 blob 存储在多行中的冗余。
  • 这看起来很简单,包含 Division、Message 和 DivisionMessage。评论在 DivisionMessage 中,而 Done 在 Message 中。

标签: php mysql database database-design


【解决方案1】:

messages拆分成两个表;我会打电话给他们m1m2

m1 的所有列在所有分区中保持不变。这可能包括消息的大量文本。让我们有PRIMARY KEY(m_id)m_id 可以是 AUTO_INCREMENT。听起来done 需要在此表中。

m2 每个分区有一行,因此,它有middivision_id 的副本,所以可能是PRIMARY KEY(mid, division_id)(或者可能以相反的顺序)。此表中还有各部门之间不同的列。

m1:m2 是一个 1:many 关系,通过m_id 实现。该列将用于JOINing

听起来“cmets”是按部门划分的。所以comment(无论它在哪里)都会同时包含m_iddivision_id

【讨论】:

  • 唯一的问题是,这些消息很可能在它们发布的多个部门中是相同的,但它们可以被编辑。编辑可能仅适用于单个部门。如果整个部门的信息始终相同,您提到的解决方案确实是完美的。
  • @Maarten - 所以,编辑不会复制到其他部门,但“完成”是?你一团糟。
  • 我知道这听起来很疯狂。客户的要求与逻辑相去甚远,但这正是组织的运作方式(或者至少是他们想要的运作方式)。
  • @Maarten - 我会推迟“完成”而不考虑编辑消息。这闻起来像是他们没有想到的设计缺陷。他们甚至可能会拍拍你的后背指出缺陷并在系统中修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2023-03-27
  • 2012-08-27
  • 2018-01-07
  • 2019-04-15
  • 2017-05-12
相关资源
最近更新 更多