次の方法で、日付とタイプに基づいて SELECT する必要があるさまざまなメッセージ タイプ (20 としましょう) があります。
すなわち... WHERE date BETWEEN [fromDate] AND [toDate] AND type = [0 - 20 different types]
さまざまな種類のメッセージに共通する列はほとんどありませんが (日付が最も重要です)、すべての種類のコメントを「一度に」日付順にフェッチする必要があります。メッセージには、スレッド化された会話を可能にする自己参照があります。メッセージは常に 1 つのタイプであり、1 つのタイプのみです。
アーカイブには 5,000,000 件のメッセージがあり、会話内のメッセージが 50 を超えることはめったにないため、日付または会話 ID で効率的に選択できる必要があります。したがって、単一の「すべてのメッセージの母」テーブルと1 .. 0-1
、メッセージテーブルと関係のある複数の追加テーブルがあります。
messages: [id, date, parent_id (nullable), ... ]
msgs_type1: [col1, col2, col3, col4, ...]
msgs_type2: [col1, col2, col3, col4, ...]
そして、ここで私の質問 です。通常、これらのタイプのテーブル間の関係をどのように指定しますか? たとえば、次の方法でテーブルを結合することの (欠点) 利点は何ですか。
messages: [id, date, parent_id (null), **msg_type_1 (null), msg_type_2 (null)**, ...]
msgs_type1: [col1, col2, col3, col4]
msgs_type2: [col1, col2, col3, col4]
...
(メッセージで指定されたオプションの関係)
messages: [id, date, **type**, parent_id (null)]
msgs_type1: [**message_id**, col1, col2, col3, col4]
msgs_type2: [**message_id**, col1, col2, col3, col4]
...
(msgs_type テーブルで指定された必須の関係、メッセージで指定されたルックアップ テーブル)
あるハンスでは、メッセージのタイプを指定するために、そのうちの 1 つの列 (のみ) に値が必要な 20 のオプションの列があるのは汚いと感じます。
一方、代わりに「タイプ」列挙列を使用し、それを使用して追加情報を探すテーブルを手動で推測することも間違っているように感じます-そしておそらくほとんどのORMで作業するのに多大な苦痛を引き起こすでしょう.
では、この本はこれらのタイプの構造について何と言っているでしょうか? 200 種類のメッセージがある日はどうでしょうか。