まず良いデザイン
データ、および SQL と ERD の読みやすさ/わかりやすさは、考慮すべき最も重要な要素です。読みやすさのために:
- に入れ
city_id
ますplace
。理由: 場所は都市にあります。ホテルは、ホテルであるという理由だけでたまたま都市にある場所ではありません。
考慮すべきその他の設計ポイントは、この構造が将来どのように拡張されるかです。新しいサブタイプの追加を比較してみましょう:
- デザイン 1 では、新しいテーブル、「場所」への関係、およびへの関係を追加する必要があります。
city
- 設計 2 では、新しいテーブルと関係を「場所」に追加するだけです。
私は再び2番目のデザインに行きます。
パフォーマンスセカンド
さて、私は推測しcity_id
ていますが、サブタイプを入れる理由はおそらく、特定のユースケースでより効率的または高速であると予想されるためであり、これは読みやすさ/理解可能性を無視する非常に良い理由かもしれません. ただし、展開する実際のハードウェアでパフォーマンスを測定するまで、次のことはわかりません。
- どちらのデザインが速いですか
- パフォーマンスの違いが実際にシステム全体を低下させるかどうか
- 他の最適化アプローチ (SQL またはデータベース パラメーターのチューニング) が実際にそれを処理するためのより良い方法であるかどうか。
設計 1 は、データベースを ERD で物理的にモデル化する試みであり、これは悪い習慣であると私は主張します。
時期尚早の最適化は、SW エンジニアリングにおける多くの問題の根源です。
サブタイプアプローチ
ERD にサブタイプを実装するには、次の 2 つの解決策があります。
- 共通プロパティ テーブル、およびサブタイプごとに 1 つのテーブル (これが 2 番目のモデルです)
- サブタイプ プロパティ用の追加の列を含む単一のテーブル。
単一テーブルのアプローチでは、次のようになります。
- サブタイプ列
TYPE INT NOT NULL
. 行がレストラン、バー、ホテルのいずれであるかを指定します
- 余分な列
property_X
、property_Y
およびproperty_Z
。place
長所と短所の簡単な表を次に示します。
単一テーブル アプローチの欠点:
- 単一テーブル アプローチでは、拡張列 (X、Y、Z) を NOT NULL にすることはできません。行レベルの制約を実装できますが、単純な NOT NULL の単純さと可視性が失われます
- 特に追加のサブタイプを追加すると、単一のテーブルは非常に広く疎になります。最大に達する可能性があります。一部のデータベースの列数。これにより、この設計は非常に無駄になります。
- 特定のサブタイプのリストを照会するには、
WHERE TYPE = ?
句を使用してフィルタリングする必要がありますが、サブタイプごとのテーブルははるかに自然です `FROM HOTEL INNER JOIN PLACE ON HOTEL.PLACE_ID = PLACE.ID"
- 私見、オブジェクト指向言語のクラスへのマッピングは難しく、あまり明白ではありません。この DB が Hibernate、Entity Beans などによってマップされる場合は回避することを検討してください
単一テーブル アプローチの利点:
- 単一のテーブルに統合することで、結合がなくなるため、クエリと CRUD 操作がより効率的になります (ただし、このわずかな違いが問題になるのでしょうか?)
- さまざまなタイプのクエリはパラメータ化されているため(
WHERE TYPE = ?
)、SQL 自体ではなくコードでより制御しやすくなっています ( FROM PLACE INNER JOIN HOTEL ON PLACE.ID = HOTEL.PLACE_ID
)。
最適な設計はありません。最も頻繁に実行する SQL および CRUD 操作の種類に基づいて選択する必要があり、場合によってはパフォーマンスに基づいて選択する必要があります (ただし、一般的な警告については上記を参照してください)。
アドバイス
すべてが同じであれば、デフォルトのオプションは 2 番目のデザインにすることをお勧めします。ただし、上に挙げたような重大な懸念がある場合は、別の実装を選択してください。ただし、時期尚早に最適化しないでください。