0

約10万行のデータと、すべてのデータをいくつかの共通フィールドに保存したいと考えています。すべてのデータにはカテゴリがあり、他のフィールドはカテゴリに基づいています。

たとえば、データがカテゴリ 1 の場合extrafield1extrafield2

データを保存するための2つの方法を検索して見つけました。

1-名前と値のペア

Table1
ID    Name     Category   Field2           Field3
1     Name1    1          Value            Value
2     Name2    2          Value            Value

Table2 
ID    Table1_ID         Name           Value
1     1                 extrafield1    1
2     1                 extrafield2    2
3     1                 extrafield3    3
4     2                 extrafield4    4
5     2                 extrafield5    5

2-親子テーブル

Table1
ID    Name     Category   Field2           Field3
1     Name1    1          Value            Value
2     Name2    2          Value            Value

Tableforcategory1 
ID    Table1_ID         extrafield1    extrafield2     extrafield3
1     1                 1              2               3


Tableforcategory2 
ID    Table1_ID         extrafield4    extrafield5
1     2                 4              5   

したがって、私の質問は、方法 1を使用する場合と方法 2を使用する場合です。

4

2 に答える 2

1

方法 2 は、さまざまな理由から一般的に好まれます。

  • さまざまなカテゴリで表されるエンティティをより厳密にモデル化します。
  • 列に異なるデータ型を持たせることができます。
  • 値のみの列のチェック制約の実装が容易になります。
  • 参照列の外部キー制約の実装が容易になります。
  • 一意の制約が適切であれば、実装が容易になります。
  • 非 NULL 値とデフォルト値の実装が容易になります。
  • 特定の属性値に列を追加しやすくなります。

そして、他の理由があるかもしれません。

エンティティ属性値モデリング (EAV) と呼ばれる最初の方法は、間違いなく別の方法です。主に次の 2 つの状況に適しています。

  • 属性の数が、使用しているデータベースの列制限を超えています。
  • 属性はまばらに設定されているため、特定のエンティティで使用されているのはごくわずかです。

場合によっては、これら 2 つの方法のハイブリッドが適切であり、一般的に使用される属性がリレーショナル形式で格納され、スパース属性が EAV として格納されます。

JSON または XML オブジェクトに値を格納するなど、別の方法もあります。これらは一般的には推奨されませんが、特定の状況 (特に、すべての属性を 1 つのブロックとして扱い、一緒に返して設定する必要がある場合) の下で、一部のデータベースに適している場合があります。

于 2016-01-10T15:12:50.847 に答える