2

私はphpでmysqlデータベースを使用してWebアプリケーションを構築しています。

attachment多くのマスターテーブルの共通テーブルである子テーブルがあります: teacher、、(およびその他)。マスター テーブルの数が 10 を超えているとします。たとえば、n テーブルとします。studentclassRoom

私の質問は、次のことを行うのが良い方法ですか?

  1. データベースに「attachment」というテーブルを 1 つだけ作成し、それを masters に関連付けます。
    これにより、添付テーブルに n 個の外部キー (つまり、n-1 個の未使用の列) が作成され、モデルを作成するたびに初期化または使用されることなく、モデル内の n-1 個の属性にもつながります。

  2. (master_i_Attachment) と呼ばれるマスター テーブル (master_i) ごとにテーブルを作成し、そのマスターにのみ関連付けます。しかし、これにより、n 個の添付ファイル テーブルと n 個の添付ファイル モデルがコード内に作成されます。

何かアドバイス ?

4

2 に答える 2

1

データベースの正規化の概念に基づいて、冗長で初期化されていない (または null) 値をデータベースで使用することは推奨されません。実際、正規化はますますデータを分離しようとします (これは、異常に対してより多くのテーブルを意味します)。ただし、ルールを無視するか、パフォーマンスの問題のためにデータベースを非正規化することができます。

あなたの場合、最も単純な(そして正規化された)方法は、選択肢番号#2(添付ファイルの種類ごとに個別の表)になると思います。しかし、Ashalynd が言うように、デザインを微調整することはできます。テーブルtypeに列を配置して、親テーブルを指定します。ところで、この方法を使用すると、データベースのカスケード変更が複雑になります。

于 2013-10-13T13:10:38.673 に答える
1

できることは、id、reference_id (親テーブルの 1 つ)、reference_type (つまり、reference_id が属するテーブル)、(添付テーブルの他のすべてのフィールド) のフィールドを持つテーブルを作成することです。

次に、たとえば、特定の親タイプの添付ファイルを取得する場合、そのタイプで SELECT クエリ フィルタリングを実行できます (例: WHERE reference_type='classroom')。

または、特定の ID を持つクラスルームの添付ファイルを取得する場合:

SELECT * FROM attachment WHERE reference_id=<ID> AND reference_type = 'classroom';

おそらく、複合一意キーを (reference_id, reference_type) に設定して、重複した添付ファイルを取得しないようにすることをお勧めします (ただし、特定のタイプの特定の ID に複数の添付ファイルを含める可能性を望まない場合は除きます)。この場合、キーは一意であってはなりません)。

このソリューションがニーズに合っているかどうかは、データをどのように使用するか、つまり最も頻繁に実行するクエリの種類によって異なります。

于 2013-10-13T13:01:56.150 に答える