1

リストや他のモデルの表現である複数の値を持つ多くの属性を持つモデルがあります。私の研究により、私はEntity-Attribute-Value designをそのように表現することができましたが、私は推奨よりも知識の豊かな人々からもっと落胆しています。複数の属性を持つモデルのEAVデータベース設計(他のモデル)

私にこだわっ一つは、このコメントである:一言で言えば

属性のリストが頻繁に成長している場合、またはそれがあれば、ほとんどの行は、ほとんどがNULLで埋め込まれることを非常に大きくだされている場合、EAVに便利ですすべての属性を列にしました。その文脈の外で使用されると、アンチパターンになります。

by Karl Bielefeldt

基本的に私のモデルはstudent_reportです。これは、実際のフォームに基づいて、次の属性があります。

  • ID
  • クリエーター
  • 改訂履歴
  • 部門
  • 参照
  • 資金(オプション、変数/固定されていない)
  • コメント
  • 目的(段落)
  • スコープ(段落)

creatorrevision historydepartmentreferencesfundingcommentsこのフォームはに依存しているであろう他のモデルです。

私の当初の計画は唯一以下でstudent_reportを作成することです:他人ながら

  • ID
  • 作成者の
  • ID
  • 目的
  • 他の段落スタイルのコンテンツ

revision history,department,references,fundingおよびcommentsには、外部キーstudent_report_idがあります。例えばreferencesfundingとして可変/固定されていないモデルについて

、Iは、DBを正規化するために、これらの「リスト」にstudent_formを接続するメディエータ・テーブルを使用する計画:

  • student_report

    | id | name   | 
    |----|-----------------| 
    | 1 | Abraham Smith | 
    | 2 | Betty Gladstone | 
    | 3 | Chen Hong  | 
    
  • references

    | id | name   | 
    |----|--------------| 
    | 1 | Reference 1 | 
    | 2 | Reference 2 | 
    | 10 | Reference 10 | 
    
  • report_references

    | user_id | reference_id | 
    |---------|--------------| 
    | 1  | 2   | 
    | 1  | 3   | 
    | 2  | 10   | 
    

は私の提案された解決策は十分ですか?これは小規模のプロジェクトになり、1日に数百回の使用が必要になるとは思えません。

答えて

2

EAVは、データモデルがよく理解されていない場合にデータをキャプチャするのに役立ちます。これにより、データ分析をスキップして、データの実際の構造が何であるかにかかわらず、データの本体を処理するように適応性が高い単一の設計を思いつくことができます。

しかし、欠点があります。保管時にデータを分析していないので、データを取り出してレポートや抽出などの便利なものに変換するときにデータを分析する必要があります。さもなければあなたの結果は無意味です。この欠点は、状況によっては、あなたが以前経験したものよりもはるかに大きくなる可能性があります。

あなたの場合は、保存する属性とその属性の意味をよく理解しているようです。また、属性リストが驚きに基づいて拡張する必要があるとは思われません。

EAVを避け、代わりに属性の関係を構成する方法に集中することをお勧めします。関係は、属性の集合であり、何らかの方法でグループ分けされており、卑劣で有用なものです。あなたが気にしているなら、このトピックについての本を読むことができます。

SQLでは、テーブルはリレーションを表します。テーブルには、タプルを表す行があります。表には属性を表す列があります。行と表の共通部分は、値を格納できる場所を提供します。 !NFでは、各場所に「シンプルな」値が格納されます。

あなたのデザインは私にはかなりよく見えます。 EAVモデルよりも優れたサービスを提供できると思います。私はそれが完全に正規化されているかどうかは分かりません。

+0

私が提案した解決策は、最初は設計上EAVであると考えられたため、私は疑念を抱いていました。あなたの知識を共有していただきありがとうございます。はい、私の目標は、あなたが言及したように、クエリをバックエンドでストレスの少ないものにするためにテーブルを正規化することです。 –

+0

1NFを使用すると、適切なインデックスを使用してクエリをより簡単に作成して実行することができます。 2NF以降ではクエリが簡単になりません。特定の更新異常を防止します。非常に慎重なプログラミングでこれらの異常を防ぐこともできますが、最初に正規化して予防する方がよい場合があります。 –

関連する問題