2

誰かがこれにアプローチする正しい方法を教えてくれたらありがたいです:

  • 主キーを持つ親テーブルがありますmaster_id
  • master_id に 1 対 n の関係で関連付けられた 5 つの子テーブルがあり、意味的に異なるタイプのデータを記録します (抽象化には適していません)。
  • 各子テーブルの唯一の共通フィールドは、master-id(外部キー)、created_by(user_id)、created_time(タイムスタンプ) です。

目的は、マスター ID に関連付けられた各子行を Web ページ上で時系列順に公開することです (フォーラムの投稿スタイルの表示を想像してください)。PHP は、子テーブルに応じて各「投稿」(つまり行) をわずかに異なる方法で構築します (およびしたがって、利用可能なデータのフィールド)。

テーブル構造に関係なく、これをクエリする簡単な方法はないと考えているのは正しいですか (そして、その順序付けは PHP で行うのが最適です)。3 つの共通フィールドを垂直に分割して、tableフィールドと組み合わせた単一のテーブルにする利点はありますか?

4

2 に答える 2

2

これは解決するのが非常に難しい問題であり、私が自分で取り組んだ問題です。残念ながら、私には良い答えがありません。UNIONとさまざまなタイプのJOINを使用できますが、データベースのパフォーマンスが大幅に低下する可能性があります。さらに、たとえば、最新の30の時系列エントリが必要だというような問題が発生します。どの子テーブルに最新の30エントリがあるかわからないため、すべての子テーブルに30エントリ(おそらく全部で150エントリ)をクエリし、コードでそれらを並べ替える必要があります。30を引くだけで150行、blech。

正直なところ、そのようなことを実装するために私が見つけた最善の方法は、テーブル、場合によってはマスターテーブルに、子テーブルから表示したいもの専用の列を用意することです。たとえば、マスターテーブルに、、、、、などの列を設定します(たとえばmaster_id、 Facebookcreated_byのタイムラインなどを実装しようとしている場合)。子テーブルにトリガーを設定して、それらの1つにデータを挿入すると、マスターテーブルにもデータが自動的に入力されるようにすることができます。次に、タイムラインを表示するときに、子テーブルをまったく気にせずにマスターテーブルをクエリするだけです。created_timenotification_text

スキーマは次のようになります。

Table master
- master_id
- created_by
- created_time
- notification_text

Table child1
- id
- master_id
- data1 (used to generate notification_text in master)

Table child2
- id
- master_id
- data21 (collectively used to generate notification_text in master)
- data22 (collectively used to generate notification_text in master)
- data23 (collectively used to generate notification_text in master)

...
于 2012-05-30T22:32:57.133 に答える
0

スターモデルをやってみませんか?これは一般的にデータ ウェアハウスの作成に使用されますが、ソリューションで同様のものを使用することもできます。スター モデルに慣れていない場合は、こちらで詳細を確認できます。

それが役に立てば幸い。

于 2012-05-30T21:28:32.287 に答える