2

たとえば、多くのユーザーがいるとします。ユーザーが何かメッセージを送信するたびに、他のユーザーのリストにメッセージを送ることができます (一括メール送信と同様)。ただし、ストレージ スペースを節約するために、メッセージを 1 回保存したいだけです。そのため、メッセージ受信者の 1 人がメールボックスを開くと、そこでそのメッセージを照会する必要があります。メッセージング システムのエンティティ (テーブル) の設定に関して、より効率的なのはどれですか? 注意: 非 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.

どちらの戦略がより効率的だと思われますか? つまり、単純に DBMS を反復処理するよりも、配列リストを反復処理する方が遅いですか?

どんなコメントでも大歓迎です。

*注: メッセージは任意に長くなる可能性があるため、同じメッセージの複数のコピーを保存したくありません。

ありがとうございました。

4

1 に答える 1

1

Google IO 09での Brett Slatkin の「Building Scalable, Complex Apps on App Engine」の講演をご覧ください。

彼は「RelationIndex」として知られるパターンを提示します。これは最初の提案に似ていますが、リストを独自のエンティティに移動します。リスト エンティティの key-name をメッセージの key-name に設定すると、keys_only queryを使用してユーザーへのメッセージをスキャンし、受信者のリストを逆シリアル化する費用をかけずにメッセージ自体のみを読み込むことができます。

于 2011-02-04T19:41:47.610 に答える