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

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

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

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

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

Q&A

解決済

2回答

43048閲覧

[DB設計]汎用区分マスタについて

mona

総合スコア30

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

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

6グッド

7クリップ

投稿2016/02/29 11:46

データベース設計について質問です。

現在、Webシステムの基本設計段階で
「汎用区分マスタ」というテーブルを設計しています。

・多言語対応するために、一つの区分値に対して
複数の言語での名称を登録する必要がある
・今回は日本語対応のみ
・現在は「マスタを更新しない、参照のみの区分」しか存在しない
・将来的にはカスタマイズでマスタメンテ画面を追加し、
区分や区分値が更新対象になる可能性がある
という前提です。

開発環境は
言語:Java,JavaScript
DB:SQL Server
です。

過去に他の案件で使用していた同じ役割のテーブルを参考に
現在は下記のようなテーブル定義になっています。

分類コード varchar(30) PK
区分値 varchar(30) PK
言語コード varchar(3) PK
表示名 nvarchar(100) NOT NULL
表示順 smallint NOT NULL
備考 nvarchar(200)
予備項目1 nvarchar(200)
予備項目2 nvarchar(200)
予備項目3 nvarchar(200)
削除フラグ bit
登録日時 datetime2
登録者ID nvarchar(20)
登録APP nvarchar(50)
更新日時 datetime2
更新者ID nvarchar(20)
更新APP nvarchar(50)

例えば、課税区分と国なら(一部抜粋)
分類コード 区分値 言語コード 表示名 表示順
KAZEI_KBN 1 JPN 内税 1
KAZEI_KBN 2 JPN 外税 2
KAZEI_KBN 3 JPN 非課税 3
KUNI_KBN AD JPN アンドラ 16
KUNI_KBN AE JPN アラブ首長国連邦 8
KUNI_KBN AF JPN アフガニスタン 5


といったデータを格納します。

自分で調べてみたのですが

■メリット
・マスタメンテ画面が1つで済む
・分類コードの条件を変更すれば複数の機能や画面で表示名の取得SQLを使用できる
・個別のマスタを持つよりテーブル数が少なくなる
・新しい分類が増えてもテーブルを増やさなくて良い

■デメリット
・データの件数が多くなり、検索コストが上がる
・テーブルのレコードを見ないとどんな値を保持しているかわからない
・余裕を持って桁数の大きい項目や、予備カラムを用意している分データ容量が増える

というような内容しかわからず、個人的な感覚としては
「テーブルの数が増えても、個別のマスタを準備した方が良いのでは?」
と思うのですが、上手く説明できません。

なんとなく、個別マスタを持った方が良い条件は
・複数の画面でドロップダウンリストに表示する
・区分と名称以外の項目(上位分類など)がある
・専用の区分値更新処理(他システムからの連携、マスタメンテ画面など)がある
・区分値の有効期限がある(キーに期間の情報を持たせる)
かな?と思っているのですが
・それ以外の「主に区分値と名称の表示しか使用しない区分」は
全て汎用区分マスタにつっこんでしまえば良いの?
・将来マスタメンテ画面が出来た場合を考えると
できるだけ汎用区分マスタを使用した方が良いの?
・予備カラムって無駄じゃないの?
どんなデータが入るかわからないから桁数を
大きめに持っておくのってどうなの?
といった疑問が湧いてきます。

私にとって、初めてのデータベース設計で困っています。
区分値のマスタテーブルはどのように設計すればよいのでしょうか?

解説、経験談(設計・開発)もあればお願い致します。
このようなテーブル設計について参考になるサイトや書籍などがあれば
教えてください。
宜しくお願い致します。

dthani, yodel, Ruse, ikuwow, ktakeishi, jhashimoto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

「汎用区分」の扱いについては、
Entity-Attribute-Value
と呼ばれるSQLアンチパターンに該当するかと思います。

以下のページに同様の質問をされている方がいらっしゃる様に思いました。

「メタデータテーブル」という設計 / 考え方について、ご意見をお聞きしたいです

投稿2016/02/29 12:05

bzcat

総合スコア37

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

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

mona

2016/03/01 04:16

ありがとうございます。 SQLアンチパターンなのですね。 リンク先の内容も非常に参考になりました。 1. データの整合性を担保できない 2. SQLを構築するの面倒 など、カスタマイズでマスタメンテ画面を作成するときは 特に注意が必要ですね。。 今回は要件定義の段階で「汎用区分マスタを使用する」と決定しているので、 デメリットや実装上の注意を理解して 立てられる対策を立てた上で使用するようにします。 「なんとなく良くない」の理由が明確になり、助かりました。
guest

0

Entity-Attribute-Value は汎用機からオープン系への移行で汎用機で使っていたからそれを継承する、ってお客様で多いです。
汎用機では汎用区分毎にメンテ画面を作るのにそれなりのコストと時間がかかりますが、オープン系ではテーブル毎にメンテ画面を作るのはさほどコストはかかりません。ER図は解りにくいし、SQLがかなり複雑になります。

あと、社外とデータ交換する為には国コードはISO_3166-1にして置くとデータ交換する際にコード変換が少なくて済みます。

投稿2016/03/07 19:56

Orlofsky

総合スコア16415

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

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

mona

2016/03/08 01:08

回答ありがとうございます。 > 汎用機からオープン系への移行で汎用機で使っていたからそれを継承する、ってお客様で多いです。 「これまで使っていたから」「区分はまとめて1画面でメンテしたい」というお客様の要望と、上流工程を行っている上司がEntity-Attribute-Valueを推奨しているのか自社で設計を行ったほとんどのシステムにこのようなテーブルが存在しています。。 > 汎用機では汎用区分毎にメンテ画面を作るのにそれなりのコストと時間がかかりますが、オープン系ではテーブル毎にメンテ画面を作るのはさほどコストはかかりません。ER図は解りにくいし、SQLがかなり複雑になります。 開発を行う身からすると困ったことばかりですね。 同じロジックを流用してテーブル単位に画面をタブで切り替える方など、今後他の方法も提案してみようと思います。 > あと、社外とデータ交換する為には国コードはISO_3166-1にして置くとデータ交換する際にコード変換が少なくて済みます。 こちらも教えて頂きありがとうございます。 例に挙げたのは既存システムにあったデータなのですが、国の区分値は「ISO 3166-1 alpha-2」になっているみたいです。 「コード変換で苦労する」という経験は他のシステムで経験したことがあるので、その点も留意して設計・開発を行いたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問