基本规范化问题

时间:2011-08-22 09:52:07

标签: mysql data-structures normalization

这可能不是一个“规范化”的问题,它更多的是我正在保存的数据类型。

我刚刚完成了邮件和电子邮件系统的规范。我的想法是,我需要保存我的Web服务内部的所有消息,但也知道是否已使用该消息发送了一封电子邮件。

这是规范。


规范


  • 任何邮件都存储在一个表格中。
  • 邮件可以来自未注册的用户或注册用户。

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

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

  • 消息由用户拥有(意味着他们被发送到)或消息由用户角色共享。

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

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

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

      c)首次阅读邮件的日期

      d)邮件发送日期

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

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

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

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

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

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

  • 与产品查询相关联的邮件将保存他们要查询的产品的ID。 (即相关财产)。

结束规范


现在实际问题......

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

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

您对此型号有何看法?我没有复制任何数据,但我正在分离保存数据的位置。我应该只有一个email_sent表来记录所有这些信息。

2 个答案:

答案 0 :(得分:1)

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

如果单个用户的标志email_sent的含义与一组用户的成员相同,那么在两个地方一直查找基本上是一种信息的内容单调乏味(在代码方面可归结为可能很慢并且难以支持)。

另一方面,email_sent可能是对您的交易或报告逻辑不重要的事情,而且只是一个有趣的事实,即“顺其自然”。在这种情况下,尝试强制将两个不同的email_sent标志放在一个地方可能需要一个不方便且不可取的混搭两个实体,这些实体应该是因为所有其他更重要的属性而不同。

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

答案 1 :(得分:1)

创建3个表:

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

  2. 的MSG
  3. 使用roleId,userId

  4. 进行操作
  5. 使用userId,MsgId,日期打开,阅读等的ACCS

  6. MSG记录消息,其类型是来自角色或未注册用户

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

    ACCS记录用户注册或未注册的所有内容。

    要检索,请使用ACCS加入MSG类型U

    使用ROLES加入MSG类型R,然后使用ACCS

    加入

    要检索所有,UNION他们