良好的数据库设计/规范化

时间:2015-12-30 17:12:06

标签: mysql database normalization

我被分配了一项任务,我不知道如何处理它:

我必须构建一个支持多个设备的消息系统,它应该尽可能高效。 用户最多可以拥有10个设备,当用户收到消息时,这些设备都需要接收消息。

我有两个想法:

Table Messages:
- ID (PK)
- SenderID
- ReceiverID
- Data

Table PendingTransmissions:
- MessageID (FK (PK of above table))
- DeviceID (FK)

这里的问题是,每次发送消息时,每个设备都会创建一个条目并导致很大的开销。

Table Messages:
- ID (PK)
- SenderID
- ReceiverID
- Data
- ReceivedDevice1
- ReceivedDevice2
- ReceivedDevice3
- ReceivedDevice4
- ReceivedDevice5
- ReceivedDevice6
- ReceivedDevice7
- ReceivedDevice8
- ReceivedDevice9
- ReceivedDevice10

这里的问题显然是设备的冗余,但开销会更低。

什么是更好的解决方案,还是我完全错过了什么?

提前致谢!

2 个答案:

答案 0 :(得分:3)

第一种方法是完全有效的,它应该是要走的路。第二种方法的可维护性是一种恐怖,并且在稍后添加一些代码时,代码将无法读取(我必须维护多个DB,这是以这种方式设计的)。

答案 1 :(得分:3)

我建议反对第二种方法(至少)有两个原因:

  • 今天,一个用户可以拥有10台设备。如果该数字在未来更改为20,则意味着应用程序中许多层的更改:数据库,应用程序实体类,DAO等。
  • 将来,您可能希望为群组添加功能。为此扩展这个设计会很麻烦。

在第一种方法中,如果您担心PendingTransmissions变得太大,您可以像这样照顾它:

  • 添加两列:isDelivereddeliveredTimestamp。然后,您可以定期存档所有已交付且比1个月更早的行。