1

PHP Web アプリケーションを構築する予定で、すでに Codeigniter + DataMapper を使用することに決めています(オーバージーラス版).

DataMapper を発見しました(オーバージーラス版)実際には 1 対多の関係しかない場合でも、追加の関連付けテーブルを使用する必要があります。

たとえば、国には多くのプレイヤーが所属できますが、プレイヤーは 1 つの国にしか所属できません。典型的なデータベース設計は次のようになります。

[countries] country_id(pk), country_name
[players] player_id(pk), player_name, country_id(fk)

ただし、DataMapper では、次のような設計が必要です。

[countries] country_id(pk), country_name
[players] player_id(pk), player_name 
[asso_countries_players] countries_players_id(pk), country_id(fk), player_id(fk)

後でプレイヤーが複数の国に所属できることに気が変わった場合でも、ほとんど手間をかけずに実行できるため、メンテナンスに適しています。

しかし、私が知りたいのは、そのようなデータベース設計では、一般的に、典型的な設計と比較してパフォーマンスの向上または低下があるかということです。

4

3 に答える 3

3

「何かをするための最速の方法は、何もしないことです。」-- Cary Millsap 著、Oracle パフォーマンスの最適化

「デザイナーは、追加するものが何もないときではなく、取り除くものが何も残っていないときに、真のエレガンスを達成したことを知っています。」-- アントワーヌ・ド・サン=テグジュペリ

より単純な実装には、2 つのテーブルと 3 つのインデックス (2 つの一意) があります。より複雑な実装には、3 つのテーブルと 5 つのインデックス (4 つの一意) があります。のインデックスasso_countries_players.player_name(これは代理 ID である必要があります。チャド オチョシンコ (旧姓ジョンソン) が行ったように、プレーヤーの名前が結婚したり、合法的に変更されたりした場合はどうなりますか?) も、0.. 1 プレイヤーと国との関係の性質。

関連付けエンティティがデータ モデルで必要ない場合は、削除します。一般に、0..1 関係または 1..n 関係を n..n 関係に変換するのは非常に簡単です。

  1. 連想エンティティを追加します(関係自体に開始日や終了日などの属性がない限り、代理キーが必要かどうか疑問に思います)
  2. 関連付けられたエンティティに既存のデータを入力する
  3. 外部キー制約を再実装する
  4. 子テーブルの置き換えられた外部キー列を削除します。
于 2010-02-18T22:00:26.193 に答える
2

データを選択して検索すると、より多くの結合が行われます。2 つではなく 3 つのテーブルで作業する必要があります。

データを挿入すると、より多くの挿入クエリが必要になります。2 つではなく 3 つのテーブルに挿入する必要があります。

したがって、これはもう少し作業が増えることを意味する可能性があると推測しています。その結果、パフォーマンスが少し低下する可能性があります。

于 2010-02-18T18:07:47.117 に答える
1

これは 1 対多であるため、個人的には関連付けテーブルを使用したくないので、まったく不要です。

この決定によるパフォーマンスへの影響はそれほど大きくありません。ただし、データのコンテキストについても考えてください。一部のプログラムが指示するからといって、単にそれを行うのではなく、データを理解してください。

于 2010-02-18T20:34:52.543 に答える