前提・実現したいこと
IPプロトコルに対応したネットワークカメラやネットワークスピーカーに一括で設定反映する.Netアプリを開発しているのですが、データベース設計に悩んでいます。
実際の機器は、学校のような広い場所にネットワークカメラ5台、ネットワークスピーカ5台といった形で設置されます。
悩んでいる内容
機種は計15品番程度あり、それぞれで設定できる項目が違います。
一方、共通で設定する項目もあります。
IPアドレスや端末名称は全機種設定できる、
ネットワークカメラは音量は設定できないが明るさは設定できる、
ネットワークスピーカーは明るさは設定できないが音量は設定できる、等
イメージとしては以下の通りす。
・各機種ごとに設定できる項目一覧
機種 | 端末名称 | IPアドレス | 明るさ | 音量 | WEB設定ログインID |
---|---|---|---|---|---|
機種A | 〇 | 〇 | 〇 | 〇 | 〇 |
機種B | 〇 | 〇 | ― | 〇 | |
機種C | 〇 | 〇 | 〇 | ― |
これらのデータをRDBにどのように保管するか悩んでいます。
端末IDで各端末はユニークになります。
案1:共通項目だけまとめ、個別項目は別テーブルに書き出す
端末テーブル(端末ID(PK)、機種ID、端末名称、IPアドレス等)
機種Aテーブル(端末ID(PK)、明るさ、音量、Web設定ログインID)
機種Bテーブル(端末ID(PK)、音量)
機種Cテーブル(端末ID(PK)、明るさ)
イメージ
端末テーブル
端末ID | 機種ID | 端末名称 | IPアドレス |
---|---|---|---|
1 | 機種A | a1 | x.x.x.1 |
2 | 機種A | a2 | x.x.x.2 |
3 | 機種B | b1 | x.x.x.3 |
4 | 機種B | b2 | x.x.x.4 |
5 | 機種C | c1 | x.x.x.5 |
機種Aテーブル
端末ID | 明るさ | 音量 | Web設定ログインID |
---|---|---|---|
1 | 3 | 5 | ADMIN |
2 | 3 | 5 | ADMIN |
機種Bテーブル
端末ID | 音量 |
---|---|
3 | 5 |
4 | 5 |
機種Cテーブル
端末ID | 明るさ |
---|---|
5 | 5 |
案2:1つのテーブルでまとめて管理する
端末テーブル(端末ID(PK)、端末種別、端末名称、IPアドレス、明るさ、音量)
・イメージ
端末テーブル
端末ID | 機種ID | 端末名称 | IPアドレス | 明るさ | 音量 | WEB設定ログインID |
---|---|---|---|---|---|---|
1 | 機種A | a1 | x.x.x.1 | 3 | 5 | ADMIN |
2 | 機種A | a2 | x.x.x.2 | 3 | 5 | ADMIN |
3 | 機種B | b1 | x.x.x.3 | NULL | 5 | NULL |
4 | 機種B | b2 | x.x.x.4 | NULL | 5 | NULL |
5 | 機種C | c1 | x.x.x.5 | 4 | NULL | NULL |
私の感覚でいえば以下のように、案2は矛盾したデータの登録が可能であるため、案1がいいと思っています。
例:
※機種Bに設定できてはいけない「明るさ」が設定されているが、DB制約で防げない(更新時異状)
端末ID | 機種ID | 端末名称 | IPアドレス | 明るさ | 音量 |
---|---|---|---|---|---|
3 | 機種B | b1 | x.x.x.3 | 3 | 5 |
.Netアプリのインターフェースはエクセルのような見た目のグリッド型で、複数の機種を同じ画面で設定できるようにする必要があります。
以下のようなイメージです。
・画面出力イメージ
機種 | 端末名称 | IPアドレス | 明るさ | 音量 |
---|---|---|---|---|
機種A | a1 | x.x.x.1 | 3 | 5 |
機種A | a2 | x.x.x.2 | 3 | 5 |
機種B | b1 | x.x.x.3 | 設定不可 | 5 |
機種B | b2 | x.x.x.4 | 設定不可 | 5 |
機種C | c1 | x.x.x.5 | 6 | 設定不可 |
案1にした場合、Select時に機種分Unionせねばならず、また更新時も煩雑なイメージがあります。
具体的には、上記 ・画面出力イメージ の結果を得ようとした場合、以下のような長いSQLを書く必要があります。
SQL
1SELECT 2 端末テーブル.機種ID, 3 端末テーブル.端末名称, 4 端末テーブル.IPアドレス, 5 機種Aテーブル.明るさ, 6 機種Aテーブル.音量 7FROM 8 端末テーブル 9 LEFT JOIN 10 機種Aテーブル 11 ON 12 端末テーブル.端末ID = 機種Aテーブル.端末ID 13 14UNION ALL 15 16SELECT 17 端末テーブル.機種ID, 18 端末テーブル.端末名称, 19 端末テーブル.IPアドレス, 20 NULL, 21 機種Bテーブル.音量 22FROM 23 端末テーブル 24 LEFT JOIN 25 機種Bテーブル 26 ON 27 端末テーブル.端末ID = 機種Bテーブル.端末ID 28 29UNION ALL 30 31SELECT 32 端末テーブル.機種ID, 33 端末テーブル.端末名称, 34 端末テーブル.IPアドレス, 35 機種Cテーブル.明るさ, 36 NULL 37FROM 38 端末テーブル 39 LEFT JOIN 40 機種Cテーブル 41 ON 42 端末テーブル.端末ID = 機種Cテーブル.端末ID 43
一方案2にすると、SELECT文、UPDATE文はシンプルになるものの、機種Bのデータを保存するテーブルに、意味のない「明るさ」というフィールドが出来てしまいます。
またUpdate文も、最大4テーブルたいして行う必要が出てきます。
どちらも一長一短なのですが、皆様だったらどのような設計をされますか?
屈託のない意見を頂きたく宜しくお願いします。
追記:
なお、設定項目は全部で800項目ちかくあり、共通設定項目はそのうち40~80個程度です。