3

相互に結合する必要がある MySql データベースに 6 つのテーブルがあります (6 つの項目は可能な方法で関連付ける必要があります)。また、これらの関係に何らかの方法で「sort_order」列を追加する必要もあります。「従来の ManyToMany」結合テーブルを使用すると、データベースが乱雑になり、数十の結合テーブルが作成されます。それを維持することは不可能でしょう。私が見つけた最善の解決策は、すべての行が 2 つのテーブル間の単一の関連付けを識別する、7 つの列 (6 つのアイテム ID に対して 6 つ + sort_order に対して 1 つ) を持つ単一の結合テーブルを使用することでした。

ここに私がした結合テーブルがあります:

mysql> desc relations;
+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| artist_id  | int(11) | YES  | MUL | NULL    |       |
| art_id     | int(11) | YES  | MUL | NULL    |       |
| edition_id | int(11) | YES  | MUL | NULL    |       |
| expo_id    | int(11) | YES  | MUL | NULL    |       |
| news_id    | int(11) | YES  | MUL | NULL    |       |
| press_id   | int(11) | YES  | MUL | NULL    |       |
| sort_order | int(11) | YES  |     | NULL    |       |
+------------+---------+------+-----+---------+-------+
7 rows in set (0,00 sec)

私はデータベース設計の専門家ではないので、同じ目標を達成するためのより良い設計があると思います。ベストなデザインは何でしょう?

注 1: あまりにも多くの関連付けを回避する必要があるとは言わないでください。これはプロジェクトの特定かつ正確な必要性であり、それを可能にするための最善の解決策を見つけなければなりません。

注 2: ちなみに、これは Php/MySql Web アプリケーション用で、フレームワークとして Yii を使用しています。

4

2 に答える 2

2
  1. パフォーマンスとメンテナンスの面で正しく行われていれば(正規化など)、結合は悪くありません。
  2. ニーズが実際に発生した場合にのみ非正規化してください。
  3. 最初は最も正しい(そして機能している!)パスをたどってください。パフォーマンスやその他のことについて心配する必要はありません。
  4. 時期尚早の最適化は、すべての悪の母であると言われています。
  5. 外部キー(MySQLはこれを自動的にカバーします)および、、などで使用されるフィールドに適切なインデックスを追加WHEREしますONORDER BY
于 2012-10-06T14:48:21.903 に答える
2

あなたが提案したことをしないでください。正解です。エンティティ間に多対多のリレーションシップが多数ある場合は、多数の結合テーブルが作成されます。しかし、それはあなたが提案するものよりもはるかに優れたソリューションです。真剣に。

結合テーブルに null id 値がないため、パフォーマンスが大幅に向上します。つまり、インデックス作成の利点を最大限に活用できます。

エンティティ関係の更新とトラブルシューティングが容易になります。

あなたが別の仕事に移った後、あなたのコードを保守する人は誰でも、あなたの名前を呪うことはありません。つまり、従来の問題を解決するために従来の dbms 設計手法を使用したことになり、設計が透過的になります。

これらすべての結合テーブルの DDL を生成するのに役立つスキーマ設計ツールが多数あります。ヒント: id 列の名前が一貫して統一されていることを確認してください。つまり、artist テーブル、artist_art テーブル、artist_edition テーブルでは、artist_id と呼びます。これを行うと、スキーマ設計ツールが自動的に何をしているかを整理できます。

于 2012-10-06T15:00:23.550 に答える