2

想象一下,例如,我有很多用户。每次用户发送消息时,他/她都可以向其他用户列表发送消息(类似于群发电子邮件)。但是,我只想存储一次消息以节省存储空间。因此,当其中一位消息接收者打开他的邮箱时,他/她必须在那里查询该消息。在设置消息系统的实体(表)方面,什么更有效?请注意:在非 RDBMS 中,不允许连接查询。那么这是一个合理的设置,我怎样才能使它更有效(1):

Table: Message (keeps one copy of all messages)
| Message_ID | Sender | Title | Body | List of Receivers |

// In this strategy, if I'm a receiver, I would check each message and search through the list of receivers to check and see whether I'm one of the receivers or not.

或者我应该采用以下策略(2):

Table: Message (keeps one copy of all messages)
| Message_ID | Sender | Title | Body |

Table: Message Receivers (store the same message ID for all receivers)
| Message_ID | Sender | Receiver |

// In this strategy, in runtime, make copies of the same message ID and same Sender and store one row for each receiver.

哪种策略似乎更有效?即遍历arraylist 比简单地遍历DBMS 慢吗?

任何意见将不胜感激。

*注意:消息可以任意长,因此我不想存储同一消息的多个副本。

谢谢你。

4

1 回答 1

1

查看来自 Google IO 09的 Brett Slatkin 的“在 App Engine 上构建可扩展的复杂应用程序”演讲。

他提出了一种称为“RelationIndex”的模式,它类似于您的第一个建议,但您将列表移动到它自己的实体。通过将列表实体的键名设置为消息的键名,您可以使用keys_only 查询扫描发送给用户的消息,然后仅加载消息本身,而无需反序列化收件人列表。

于 2011-02-04T19:41:47.610 回答