2

Yii と mysql のテーブルを操作する際に、(パフォーマンスに関して) より良いアプローチは何かを知りたいと思いました。

  1. すべての列を含む 1 つのテーブル
  2. 外部キー関係を持つ複数のテーブル (それらに列を分散)

基本的に、私が求めているのは、クエリを実行するときに Yii が対応するすべてのテーブルをオブジェクトにフェッチするため、単一のテーブルに多くのリレーションがある場合、パフォーマンスの低下はありますか?

より一般的な質問は次のとおりです。1対複数のテーブルと外部キーを扱うときの良い習慣とよりスマートなアプローチは何ですか(再びパフォーマンス..)

4

2 に答える 2

3

パフォーマンスが設計戦略の唯一の基準である場合は、1 を選択します。非常に悪い選択であり、問​​題の後の段階で多くの問題が発生します。

データベースは正規化を念頭に置いて設計する必要があるため、間違いなくオプション 2 を選択する必要があります。

アップデート

正規化された例と正規化されていない例: DVD レンタルのテーブルがあり、誰が DVD をレンタルしたかを追跡したいとします。

フラットテーブル:

CREATE TABLE DVD (
  DvdId INT NOT NULL AUTO_INCREMENT, 
  DvdTitle varchar(64),
  Rental1 varchar(64), 
  Rental2 varchar(64), 
  Rental3 varchar(64),
  Primary Key(DvdId)
);

レンタルエントリー3台分の空きがあり、その後トラブルあり。それ以外に、顧客の電話番号に追加のフィールドが必要な場合は、3 つの追加フィールドを作成する必要があります。

最初のステップの正規化:

CREATE TABLE DVD (
  DvdId INT NOT NULL AUTO_INCREMENT, 
  DvdTitle varchar(64),
  Primary Key(DvdId)
);

CREATE TABLE Rentals (
  RentalId INT NOT NULL AUTO_INCREMENT, 
  DvdId INT NOT NULL, 
  CustomerName varchar(64),
  RentalDate DateTime,
  Primary Key(RentalId)
);

これは改善されていますが、まだ完全には正規化されていません。顧客が同じ DVD を 2 回レンタルした場合はどうなりますか。次に、レンタル テーブルに顧客エントリが 2 つあります。

最後の:

CREATE TABLE DVD (
  DvdId INT NOT NULL AUTO_INCREMENT, 
  DvdTitle varchar(64),
  Primary Key(DvdId)
);

CREATE TABLE Rentals (
  RentalId INT NOT NULL AUTO_INCREMENT, 
  DvdId INT NOT NULL, 
  CustomerId INT NOT NULL, 
  RentalDate DateTime,
  Primary Key(RentalId)
);

CREATE TABLE Customers (
  CustomerId INT NOT NULL AUTO_INCREMENT, 
  CustomerName varchar(64),
  Primary Key(CustomerId)
);
于 2012-10-05T07:22:27.370 に答える
1

より良いオプションは、正規化ルールに適切に準拠するようにデータベースを設計することです。それらについての簡単なリンクを次に示します。

http://databases.about.com/od/specificproducts/a/normalization.htm

http://moryadesigns.wordpress.com/2009/09/08/rules-of-data-normalization-sql/

1NF繰り返しグループを排除する – 関連する属性のセットごとに個別のテーブルを作成し、各テーブルに主キーを与えます。

2NF冗長データの排除 – 属性が多値キーの一部のみに依存している場合は、それを別のテーブルに削除します。

3NFキーに依存しない列を削除する - 属性がキーの説明に寄与しない場合は、それらを別のテーブルに削除します。

BCNF Boyce-Codd Normal Form – 候補キー属性間に重要な依存関係がある場合は、それらを個別のテーブルに分けます。

4NF独立した複数の関係を分離する – テーブルには、直接関係のない 1:n または n:m の関係を 2 つ以上含めることはできません。

5NF意味的に関連する複数の関係を分離する – 論理的に関連する多対多の関係を分離することを正当化する情報には、実際的な制約がある場合があります。

ONF最適正規形 – オブジェクト ロール モデル表記法で表現される、単純な (基本的な) 事実のみに限定されたモデル。

DKNF Domain-Key Normal Form – すべての変更異常のないモデル。

Yii は広範な遅延読み込みを使用しており、関連する要素を要求して使用するまでは、関連する要素を読み込みません。

于 2012-10-05T07:43:41.187 に答える