【问题标题】:Basic Normalization Question基本归一化问题
【发布时间】:2011-11-01 00:29:51
【问题描述】:

这可能不完全是一个“规范化”问题,它更像是我要保存的数据类型。

我刚刚完成了消息和电子邮件系统的规范。我的想法是我需要保存我的网络服务内部的所有消息,但还要知道是否已经发送了包含该消息的电子邮件。

这是规范。


规格


  • 所有消息都存储在一个表中。
  • 消息可以来自未注册用户或注册用户。

    1. 未注册的用户消息将只有一个返回电子邮件地址

    2. 注册的用户消息将具有发件人的用户 ID

  • 消息要么归用户所有(意味着它们是收件人),要么消息由用户角色共享。

    1. 当一条消息归用户所有时,我们会记录有关这条消息的一些信息(与消息相同的表)。

      a) 用户是否打开/阅读了消息?

      b) 是一封_电子邮件_发送给邮件的所有者还是只是一封内部邮件

      c) 首次阅读邮件的日期

      d) 发送消息的日期

    2. 当消息被发送给一组用户时,意味着他们被发送给“所有用户”、“所有所有者”或“所有超级管理员”......

      a) 消息在messages 表中保存一次,并带有发送日期

      b) 在单独的表格中跟踪每个打开的个人

      c) 字段记录是否直接发送_电子邮件_,或者是否只是在系统内部保存。 (单独的表格)

  • 消息可以被线程化,这意味着如果一条消息得到响应,则它是子消息或原始消息。

  • 消息有不同的“类型”,意味着消息可以是“系统通知”、“查询”、“个人消息”、“私人消息”、“交易信息”

  • 链接到产品查询的消息将保存他们正在查询的产品的 ID。 (即相关财产)。

结束规范


现在是真正的问题...

正如您在项目符号 1)(b) 中看到的那样,如果还为该消息发送了一封电子邮件,我正在录制发送给个人用户的消息。

但是,当向一组用户发送电子邮件时,我会记录电子邮件是否是在完全不同的表中发送的。 显然是因为我无法将这些信息保存在同一张表中。

您对此模型有何看法。我不是在复制任何数据,而是在分隔数据的保存位置。我是否应该有一个 email_sent 表来记录所有这些信息。

【问题讨论】:

    标签: mysql data-structures normalization


    【解决方案1】:

    创建 3 个表:

    1. 带有 id(自动键)、msgtext、类型(值 U 或 R)、userId/roleId 的 MSG

    2. 具有 roleId、userId 的角色

    3. 带有 userId、MsgId、打开日期、读取日期等的 ACCS

    MSG 记录消息,带有类型以查看它是来自角色还是未注册用户

    ROLES 将一个角色指向多个用户

    ACCS 记录用户的所有内容,无论是否注册。

    要检索,请将 MSG 类型 U 与 ACCS 连接

    将 MSG 类型 R 与 ROLES 连接,然后与 ACCS 连接

    要检索所有内容,请将它们联合起来

    【讨论】:

      【解决方案2】:

      很难说你当前的设计是好是坏。从表面上看,我认为将同一条信息分成两个地方是错误的。在更接近个人的表格中添加关于发送的个人电子邮件的注释以及关于发送到更接近组的组的电子邮件的注释似乎更容易。但是,您的代码将不得不在两个地方查找有关任何电子邮件或一般所有电子邮件的信息。

      如果email_sent 标志的含义对于单个用户和对于一组用户的成员来说是相同的,那么一直在两个地方寻找本质上是一种信息的信息将是乏味的(在代码方面归结为可能很慢且难以支持)。

      另一方面,email_sent 可能对您的事务或报告逻辑并不重要,只是一个“顺其自然”的稍微有趣的事实。在这种情况下,试图将两个不同的 email_sent 标志强制到一个位置可能需要将两个实体混搭起来,这既不方便也不可取,因为它们的所有其他更重要的属性应该是不同的。

      如果不更好地了解您的业务需求,很难给出结论性的答案,但这是您必须考虑的权衡。

      【讨论】:

      • 两个地方的信息并不完全相同,我只保存标志一次,但需要在两个地方保存相同“类型”的信息。我想你明白了,只是很难指出 email_flag 只保存一次,但如果是单个电子邮件,它在消息表中,如果是组角色电子邮件,它在单独的表中。
      • 在我看来,也许您最好将属性分开,除非您决定将两种类型的电子邮件放在一个表中更好。决定因素应该是消息表是否可以/应该放在一起,而不是 email_sent 标志是否应该放在一起。
      • 是的,我将每条消息都集中到消息表中。
      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 2020-09-30
      • 2011-09-27
      • 2016-09-30
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多