質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

2回答

267閲覧

データベース設計についてアドバイスください

pokorin

総合スコア4

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/03/09 06:30

編集2020/03/09 09:05

前提・実現したいこと

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
13 5ADMIN
23 5ADMIN

機種Bテーブル

端末ID音量
35
45

機種Cテーブル

端末ID明るさ
55
案2:1つのテーブルでまとめて管理する

端末テーブル(端末ID(PK)、端末種別、端末名称、IPアドレス、明るさ、音量)

・イメージ
端末テーブル

端末ID機種ID 端末名称IPアドレス明るさ音量WEB設定ログインID
1機種A a1   x.x.x.13 5ADMIN
2機種A a2   x.x.x.23 5ADMIN
3機種B b1   x.x.x.3NULL 5NULL
4機種B b2   x.x.x.4NULL 5NULL
5機種C c1   x.x.x.54 NULLNULL

私の感覚でいえば以下のように、案2は矛盾したデータの登録が可能であるため、案1がいいと思っています。

例:
※機種Bに設定できてはいけない「明るさ」が設定されているが、DB制約で防げない(更新時異状)

端末ID機種ID 端末名称IPアドレス明るさ音量
3機種B b1   x.x.x.33 5

.Netアプリのインターフェースはエクセルのような見た目のグリッド型で、複数の機種を同じ画面で設定できるようにする必要があります。
以下のようなイメージです。

・画面出力イメージ

機種 端末名称IPアドレス明るさ音量
機種A a1   x.x.x.13  5
機種A a2   x.x.x.23  5
機種B b1   x.x.x.3設定不可 5
機種B b2   x.x.x.4設定不可 5
機種C c1   x.x.x.56  設定不可

案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個程度です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/03/09 08:04

「機種」と書いてあるからには、同じ機種で違う端末(≒IPアドレス)、同じ機種で違う端末名称のものが存在するのですか? ユニークに成り得る項目は何なのでしょうか。機種に依存する設定項目は明るさや音量、端末に依存する項目はIPアドレスのようなイメージを抱きますが、質問者さんのケースではそういうものとは違うのでしょうか。テーブルのカラムに相当するデータ項目がどんなカテゴリに属するかで設計が変わるような気もします。
pokorin

2020/03/09 08:20

機種とは、具体的にはネットワークカメラやネットワークスピーカーのことを指しています。 > 「機種」と書いてあるからには、同じ機種で違う端末(≒IPアドレス)、同じ機種で違う端末名称のものが存在するのですか?  はい。すべてIPプロトコルに対応しており、どの機種もIPアドレス、および端末名称を設定できます。 一方、明るさや音量といった項目は、機種によって設定できる・設定できないがあります。 (ネットワークカメラは音量は設定できないが明るさは設定できる、  ネットワークスピーカーは明るさは設定できないが音量は設定できる、等) 実際の機器は、学校のような広い場所にネットワークカメラ5台、ネットワークスピーカ5台といった形で設置されます。 機器には「校庭1」「校庭2」等といった、利用するときにわかりやすい名称を付けます。 >ユニークに成り得る項目は何なのでしょうか。 端末IDで端末はユニークになります。
dodox86

2020/03/09 08:24

質問の前提となることだと思いますので、お手数だとは思いますが質問への追記・修正をお願いします。
nskydiving

2020/03/09 08:57

設定項目は必ず数値型でしょうか? それとも文字列型や他の型もあり得るのでしょうか?
pokorin

2020/03/09 09:06

設定項目は文字型または数値型のみとなります。
guest

回答2

0

json型や配列の得意なDBMSであれば

案2:1つのテーブルでまとめて管理する

で、案1の個別部分を、json型や配列で管理する。

投稿2020/03/09 09:24

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokorin

2020/03/09 09:37

ありがとうございます。 その発想はありませんでした。 参考になります。
sazi

2020/03/09 10:35

アンチパターンではありますが、そもそもjson型などはそういった用途ですし。
dodox86

2020/03/09 14:35

こちらの方法ですと、行(Row)単位でみたときに共通のデータ(カラム)部分を基底クラス、拡張部分を基底クラスから継承したクラスとしてコードに表現し易いメリットがあると思います。
guest

0

すみませんが、Select時に機種分Unionせねばならず、また更新時も煩雑なイメージがとか、更新時異状が発生と言われている意味が理解できないのですが、Masterテーブルに意味のない項目が出来るのを嫌うのであれば、RDBであれば次の様な方法が考えれます。select時は機種IDでJOINすればよく、更新時も機種IDをキーにすればいいだけなので、煩雑にはなりません。

15品目程度であればどの様に設計しても問題なることはあまり無いと思いますが、一応の例として参考までに示します。

機種テーブル

機種端末名称IPアドレス
機種Aax.x.x.a
機種Bbx.x.x.b
機種Ccx.x.x.c

設定テーブル

機種設定種類設定値
機種A明るさ3
機種A音量5
機種B音量5
機種C明るさ6

投稿2020/03/09 07:54

ahidaka

総合スコア391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pokorin

2020/03/09 09:22

ご回答ありがとうございます。 ※質問内容をもう少し詳しく更新しました。 頂いたデータベース構造ですが、参考にさせていただきます。 このような構造(Key-Value型というんでしょうか)の場合、 アプリでは1万台まで端末を登録できるので、Key-Value型の場合800万行近くレコードがINSERTされます。 性能面に不安があるので検証してみようと思います。 わからないと頂いた点、説明不足でしたので、詳細を記載します。 ---------------------------------------------------- ・UNIONしなければならない点 案1の設計の場合、「**・画面出力イメージ**」の結果を得ようとした場合、 以下のような長いSQLが必要となります。 ```SQL SELECT 端末テーブル.機種ID, 端末テーブル.端末名称, 端末テーブル.IPアドレス, 機種Aテーブル.明るさ, 機種Aテーブル.音量 FROM 端末テーブル LEFT JOIN 機種Aテーブル ON 端末テーブル.端末ID = 機種Aテーブル.端末ID UNION ALL SELECT 端末テーブル.機種ID, 端末テーブル.端末名称, 端末テーブル.IPアドレス, NULL, 機種Bテーブル.音量 FROM 端末テーブル LEFT JOIN 機種Bテーブル ON 端末テーブル.端末ID = 機種Bテーブル.端末ID UNION ALL SELECT 端末テーブル.機種ID, 端末テーブル.端末名称, 端末テーブル.IPアドレス, 機種Cテーブル.明るさ, NULL FROM 端末テーブル LEFT JOIN 機種Cテーブル ON 端末テーブル.端末ID = 機種Cテーブル.端末ID ``` ・更新時異状が発生 以下のような、機種Bに設定できてはいけない「明るさ」が設定されてしまうことを、DB制約で防げないことを表しています。 |端末ID|機種ID |端末名称|IPアドレス|明るさ|音量| |------|------|--------|----------|------|----| |3|機種B| b1   | x.x.x.3 | **3**  |5 | ・更新時も煩雑なイメージ **・画面出力イメージ**で、入力可能なすべてのデータを変更した場合、 案1ではUpdate文が10必要ですが、案2では5で済みます。 案1では発行するUpdate文が多くなってしまうことを煩雑と記載しました。 ----------------------------------------------------
ahidaka

2020/03/09 14:18

追加説明と更新、ありがとうございます。この修正により、当初想定していたのとは条件が変わってしまいました。また、追加で増えた条件の優先順位とその背景が良くわからないので、以下に一般的と思われること、感じたことをコメントします。 - RDBではこのような構造(Key-Value型いうんでしょうか)でテーブルを設計するのが普通です。 - RDBでは通常、テーブルを設計時には性能の事はあまり考えません。それよりも正規化を優先して考えます。なぜなら、テーブルを設計段階ではまだ不確定な要素や重複等の問題がある可能性があり、それを明らかにする必要があるからです。例えば第3/4正規形でテーブル設計したプロトタイプ等で試験運用してみて、性能的や機能に問題が発生する様であれば、そこで初めて性能対策やデータの冗長化などを検討する様な方法が一般的です。 なお案1ではまさか、増減する可能性がある(と私が思い込んでいた)機種別のテーブルを持つことは想定していなかったので、Unionの多用や更新時の煩雑さが理解できませんでした。RDBではメンテナンスコストがかかるテーブルの追加変更を避けるので、この場合の機種の様に、グループ要素である機種別のテーブルを持つ事はあまりしませんので。 案2の場合、特にRDBにする必要は無いように思います。更新時異状とは、データの論理的な整合性が無くなることだったのですね。案2でこれを防ぐためには、確かに専用の仕組みを作る必要があります。 条件の理解が悪く、良い提案が出来なくて申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問