idと、データがデータのリストであるフィールドのみを含むテーブルがあります。例えば
-------------- | id | データ| | 1 | a、b、c、d | | 2 | a、b、k、m | ---------------
リストデータをフィールドに入れるのは良いデザインではないと思うので、どうすれば再デザインできるのか知りたいのですが。
idと、データがデータのリストであるフィールドのみを含むテーブルがあります。例えば
-------------- | id | データ| | 1 | a、b、c、d | | 2 | a、b、k、m | ---------------
リストデータをフィールドに入れるのは良いデザインではないと思うので、どうすれば再デザインできるのか知りたいのですが。
私の場合、2つのテーブル、つまりマスターテーブルとトランザクションテーブルが必要なのは、一部の詳細がすべてのレコードで同じであり、一部が変更される場合のみです。あなたの場合、idフィールドに関連するものが他にない場合は、1つのテーブルと次の構造で続行できます。
--------------
| id | data |
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | k |
| 2 | m |
---------------
ただし、同じIDレコードで同じになるIDフィールドに関連するものが他にある場合は、2つのテーブルを使用する必要があります。次の場合のように。id、name、dataの3つのフィールドがあります。現在のテーブルは次のようになります
--------------------------
| id | name | data |
| 1 | testname | a,b,c,d|
| 2 | remy | a,b,c,d|
--------------------------
新しいテーブル構造は次のようになります。
表1マスター
-----------------
| id | name |
| 1 | testname |
| 2 | remy |
-----------------
表2トランザクション
--------------
| id | data |
| 1 | a |
| 1 | b |
| 1 | c |
| 1 | d |
| 2 | a |
| 2 | b |
| 2 | k |
| 2 | m |
---------------
データベース管理を改善するために、データを正規化する必要がある場合があります。 データベースの正規化は、冗長性と依存関係を最小限に抑えるために、リレーショナルデータベースのフィールドとテーブルを整理するプロセスです。正規化には通常、大きなテーブルを小さな(冗長性の少ない)テーブルに分割し、それらの間の関係を定義することが含まれます。目的は、データを分離して、フィールドの追加、削除、および変更を1つのテーブルで実行し、定義された関係を介してデータベースの残りの部分に伝播できるようにすることです。あなたは以下のリンクでもっと見つけることができます
テーブルにこれらの2つのフィールドしかない場合は、以下のように1つのテーブルしかないはずです。
id | data
PRIMARY KEY(id,data)
それぞれのIDの重複データがないように、複合主キーを使用します。
データは次のようになります
id | data
1 | a
1 | b
1 | c
1 | d
2 | a
2 | b
2 | k
2 | m
外部キーを持つ2つのテーブルが必要になります。
表1ID
表2idデータ値
したがって、データは次のようになります。
表1:
id
1
2
3
表2:
id | data
1 | a
1 | b
1 | c
1 | d
2 | a
2 | b
2 | k
2 | m
このタイプの別のテーブルが必要になりますONE to MANY
。
たとえば、別のテーブルデータマッピングを作成できます。このデータマッピングにはdata
、ID
列ID
がデータテーブルの列に対してでFOREIGN KEY
ある列があります。ID
したがって、あなたの例によればID = 1
、データマッピングテーブルには4つのエントリがあります。
あなたは正しいです、これは良いデータベース設計ではありません。このdata
フィールドは原子性の原則に違反しているため、1NFに違反しているため、データの維持とクエリで問題が発生する可能性があります。
デザインを正規化するには、元のテーブルを2つに分割します。それを行うための2つの基本的な戦略があります:非識別を使用することと識別関係を使用することです。
注:id
親テーブルにのみ存在し、他のFKが存在せず、少なくとも1つの子がないと親が存在できない場合(つまりdata
、元のデザインでは空にできなかった場合)、親テーブルを完全に省略できます。