2011-08-22 73 views
0

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

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

这是规范。


规范
  • 的任何消息被存储在一个表中。
  • 消息可以来自未注册的用户或注册用户。

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

    2. 注册用户的信息将有发送者的用户ID

  • 的消息或者归用户(意味着它们是发送给)或消息由用户角色共享。

    1. 当消息被用户所拥有,我们记录有关此消息的一些信息(同桌的消息)。

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

      B)为一个_ 电子邮件发送 _到消息的所有者或只是内部消息

      C)日期的信息是第一读

      d)日期被发送的消息

    2. 当消息被发送到一组用户,这意味着它们被发送到“所有用户”或“所有业主”或“所有超级管理员” ......

      一)信息被保存一次Ëmessages表,每个人开放的是在一个单独的表

      c)一个字段记录跟踪的发送日期

      b)如直接_ 邮件已发送 _,或者如果它只是内部保存在系统中。 (单独的表)

  • 消息可以是带螺纹的,这意味着,如果一个消息响应,它是儿童或原始消息。

  • 消息有不同的“类型”,这意味着一个消息可以是“系统公告”,“探究”,“个人信息”,“悄悄话”,“交易信息”

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

最终规格


现在的实际问题...

正如你可以在子弹1见)(B)我录制这被发送到一个消息个人用户,如果电子邮件也发送了该消息。

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

您对此模型有何意见?我没有复制任何数据,但我分开保存数据的位置。我是否应该有一个email_sent表来记录所有这些信息。

回答

1

很难说您目前的设计是好还是坏。表面上看,我认为把同一条信息分成两个地方是错误的。查看表格中发送的个人电子邮件似乎比较容易,该电子邮件与个人较为接近,并提供有关发送给离群组较近的群组的电子邮件的注释。但是,您的代码将不得不在两个地方查找有关任何电子邮件或关于所有电子邮件的信息。

如果标记email_sent的含义对于单个用户而言与对于一组用户是相同的,那么在两个地方始终查看基本上是一种信息的内容将是单调乏味的(从代码的角度来看,它可能会很慢并且很难支持)。

另一方面,它可能是email_sent是对您的交易或报告逻辑并不重要,是一个温和的有趣的事实,是“来坐骑”。在这种情况下,试图强制将两个不同的email_sent标志集中到一个地方,可能需要一个不方便且不适宜的两个实体混搭,这两个实体由于其所有其他更重要的属性而应该是不同的。

如果不能更好地理解您的业务需求,很难给出确凿的答案,但这是您必须考虑的折衷。

+0

这不是很在同一条信息两个地方,我只能保存一次国旗,但同一个“类型”的信息需要保存在两个地方。我想你明白了,只是很难指出,email_flag只会被保存一次,但如果是单个电子邮件,它在邮件表中,并且如果它是一个组角色电子邮件,则它在单独的表中。 – Layke

+0

听起来对我来说,也许你最好将属性分开,除非您决定将两种类型的电子邮件放在一张表中更好。决定因素应该是消息表可以/应该一起走,而不是应该将email_sent标志放在一起。 –

+0

是的,我绝对把每条消息都写入消息表中。 – Layke

1

创建3个表:

  1. MSG ID为(键自动),MSGTEXT,类型(值U或R),用户ID /角色ID

  2. ROLES与角色ID,用户id

  3. ACCS with userId,MsgId,打开日期,阅读等

MSG记录我ssage,有型,看它是否从一个角色或注册用户

ROLES是指向一个角色,很多用户

ACCS记录一切,对于一个用户,注册与否。

要检索,加入味精U型与ACCS

加入味精R型的角色,然后用ACCS

要检索所有,UNION他们