2011-08-01 4 views
5

パフォーマンスとスケーラビリティの点では、MySQLで1対多のマッピングを実行するより良い方法です。1対多のリレーションシップをマッピングするときに別のテーブルが必要ですか?

  • 別の列を使用するが、2つのテーブルに付着:

    (人):ID、名前

    (電話):ID、番号、タイプ、PERSON_ID

  • 使用別表:

    (人):id、氏名

    (フォンE):ID、番号、タイプ

    (person_phone):ID、PERSON_IDがあり、これまで唯一の正しい答えだ、それは最初のものだ

+1

あなたは、必要なデータを得るために2つの結合を行うのが単一の結合を行うよりも速いと想像しますか? – R0MANARMY

+0

私はパフォーマンスと不快感について述べました。私は別のテーブルを持つことでスケーラビリティが向上するのではないかと思っていました。 – Shoaibi

+0

@ Dan:複数のデータベースサーバーでスキーマが破損している可能性がありますか? [カフェインの警告レベルは長年前に達成されたので、これは最良の議論ではないかもしれません。 – Shoaibi

答えて

11

をphone_id。

2番目の考え方は、一対多の関係ではなく、多対多の関係をモデル化する方法です。

+1

2番目のものは、異なる人が同じ電話番号を共有できることを意味します。これはBSです – Bohemian

+7

"BS"ですか?ああ、私の妻と私は何年も同じ電話を使いました。 –

+1

これは単なる例です。彼の実際の質問は、「1つの関係を多くの関係にマッピングするとき」です。穏やかにしてください:) –

5

パフォーマンスに関しては、照会する行の量に多重度を追加する結合を避けるほうが常に安いです。

1人の電話が1人の従業員(真の一対多)だけで使用される限り、最初のオプションが最適です。

+0

もちろん、結合を最小限に抑える他の領域ではトレードオフがあります。さもなければ誰もが単一テーブルのデータベースを使用するだけです(それは聞こえるほどうんざりではありません...彼らはかつてかなりの大きさを持っていました)。しかし、JOINを追加するだけでは、あなたのパフォーマンスは改善されません。 –

5

最初の方が良いです。

  1. パフォーマンスが向上しました。
  2. 保存容量が少なくなりました。
  3. わかりやすい。

P.たぶんあなたは電話のためにidを必要としないかもしれません、(number, type, person_id)で十分です。

+0

あまりにも悪い私はupvoteを1回だけすることができます。 :) – Shoaibi

関連する問題