良好的数据库 design/normalisation
Good Database design/normalisation
我被分配了一项任务,但我不确定如何完成它:
我必须构建一个支持多种设备的消息系统,并且它应该尽可能高效。
用户最多可以有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
这里的问题很明显是Devices的冗余,但是开销会小一些
什么是更好的解决方案或者我完全错过了什么?
提前致谢!
第一种方法完全有效,应该是正确的方法。第二种方法的可维护性很糟糕,稍后添加一些代码时,代码的可读性将不高(我不得不维护已经以这种方式设计的多个数据库)。
出于(至少)两个原因,我不推荐第二种方法:
- 今天,一个用户可以拥有 10 台设备。如果该数字将来变为 20,则意味着应用程序中的许多层都发生了变化:数据库、应用程序实体 类、DAO 等
- 将来,您可能希望为群组添加功能。为此扩展此设计会很麻烦。
在第一种方法中,如果您担心 PendingTransmissions
变得太大,可以这样处理:
- 添加两列:
isDelivered
和 deliveredTimestamp
。然后,您可以定期归档所有已交付且早于 1 个月的行。
我被分配了一项任务,但我不确定如何完成它:
我必须构建一个支持多种设备的消息系统,并且它应该尽可能高效。 用户最多可以有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
这里的问题很明显是Devices的冗余,但是开销会小一些
什么是更好的解决方案或者我完全错过了什么?
提前致谢!
第一种方法完全有效,应该是正确的方法。第二种方法的可维护性很糟糕,稍后添加一些代码时,代码的可读性将不高(我不得不维护已经以这种方式设计的多个数据库)。
出于(至少)两个原因,我不推荐第二种方法:
- 今天,一个用户可以拥有 10 台设备。如果该数字将来变为 20,则意味着应用程序中的许多层都发生了变化:数据库、应用程序实体 类、DAO 等
- 将来,您可能希望为群组添加功能。为此扩展此设计会很麻烦。
在第一种方法中,如果您担心 PendingTransmissions
变得太大,可以这样处理:
- 添加两列:
isDelivered
和deliveredTimestamp
。然后,您可以定期归档所有已交付且早于 1 个月的行。