一般的なスーパークラスとして機能する電子デバイスのテーブルがあり、電話、ラップトップ、カメラなどのサブクラス テーブルを分離して、スーパークラスを拡張し、デバイスに関する特定の情報を提供します (スーパークラス テーブルの外部キー deviceID を使用)。つまり、Class Table Inheritanceです。私の質問は、スーパークラスに「deviceType」列が必要ですか? 特定のデバイス ID がどのサブクラス テーブルに表示されるかを確認することでデバイス タイプを検出できるため、冗長になりますが、非常に単純なものを検出するには、不要な量の結合が必要になるようです。
一般的に、ランダムな汎用デバイスを見て、それが何のタイプなのか疑問に思う人はおそらく珍しいでしょうが、その人が簡単にそれを見つけるのが難しい設計のままにしておくのも奇妙に思えます。
別の問題は制約です...デバイスのサブタイプが1回だけになるように制約するにはどうすればよいですか? 同様に、Camera テーブルに既に存在する行と同じ deviceID を持つ行が Laptop テーブルに追加されるのを止めるにはどうすればよいでしょうか? 繰り返しますが、これが優れた UI で可能になる可能性はほとんどありませんが、データベースの制約は常に望ましいものです。
ありがとう!
PS deviceType 列を使用する場合、データの整合性を高めるために、フリー テキスト フィールドではなく、サポートするすべてのデバイス タイプの列挙テーブルにリンクされます。
明確化のために追加
最初はスーパークラス テーブルです。
汎用デバイス
deviceID brand shipDate
1 HP 05/06/09
2 Canon 11/16/08
3 Ikon 02/27/09
次に、2 つのサブクラスの例を示します。
ラップトップ
laptopID deviceID screenSize
1 1 17
カメラ
cameraID deviceID megapixels
1 2 6.5
2 3 8
GenericDevice テーブルから移行された "deviceID" のキーに注意してください。これにより、実際のデバイスのタイプに応じて、ジェネリック テーブルから任意のサブクラス テーブルへの 1 対 1 の関係が可能になります。したがって、これらの表を結合すると、HP デバイスは 17 インチ画面のラップトップであり、Canon デバイスと Ikon デバイスは両方とも、それぞれ 6.5 メガピクセルと 8 メガピクセルのカメラであることがわかります。
問題は、そもそもデバイスの種類がわからない場合に、どのようにしてデバイスの種類を特定するかということです。GenericDevice テーブルの行しかありません。例として最初の行を見てみましょう。デバイスが HP 製で、2009 年 5 月 6 日に出荷されたことはわかっていますが、最初はデバイスの種類がわかりません。しかし、deviceID = 1 の行が見つかるまで子テーブルを検索することで、それを見つけることができます。ラップトップ テーブルにはそのような行が含まれているため、HP デバイスは実際にはそのラップトップである必要があります。しかし、単純にデバイス タイプを検出するのは不必要な問題のように思えます (特に、deviceID が一致する場所を確認するために検索する必要がある 20 以上のサブクラスがある場合)。代わりに、これを行うことができます:
汎用デバイス
deviceID brand shipDate deviceType
1 HP 05/06/09 laptop
2 Canon 11/16/08 camera
3 Ikon 02/27/09 camera
これで、HP デバイスのタイプをすぐに確認できます。しかし、今では重複データがあります (暗黙的に)。理由を確認するには、ユーザーがこの変更を行ったかどうかを検討してください。
汎用デバイス
deviceID brand shipDate deviceType
1 HP 05/06/09 camera
2 Canon 11/16/08 camera
3 Ikon 02/27/09 camera
(最初の行の deviceType は camera に切り替えられました)
これで、矛盾する情報が得られました。この上の表では、HP デバイスはカメラであると示されていますが、ラップトップ テーブルにはデバイスの行があります。つまり、事実上、HP デバイスのタイプを 2 回保存しています。1 回は GenericDevice テーブルの deviceType フィールドを使用し、1 回は単純に、Laptop テーブルに deviceID = 1 の行があるという事実によって。