13

機器のリストを含むデータベースを作成しようとしています。すべての機器には特定の共通属性(メーカー、モデル番号、シリアル番号など)があり、特定の機器に固有の他の属性があります(つまり、モデムにはアクセス番号がありますが、ソーラーパネルには出力容量があります)。これらの変化する属性を優れたデータベース設計原則で表現する方法がわかりません。Webを検索してみましたが、何を検索すればよいか完全にはわかりません。

私は次の可能な解決策とそれらについての私の最初の考えを思いついた:

  1. 考えられるすべての属性を含む1つの大きなテーブルを用意し、該当しない場合はnullを入力します。明らかに、これにはいくつかの欠陥があります。

  2. 機器の種類ごとに個別のテーブルを用意してください。これは、使用するのが悪夢のようです。すべての機器のリストを印刷したい場合、どのテーブルを検索するかをどのように知ることができますか?

  3. 共通の属性を持つテーブルと、追加の属性を格納するための外部キーでアクセスされる各機器タイプの他のテーブルを用意します。私はおそらくこれを機能させることができましたが、それは面倒であり、非常に良い解決策のようには感じられません。

  4. エンティティ属性値タイプのモデル。私がやりたいことにはあまり適していないようです。

私はデータベースの経験があまりないので、ここに行くにつれて学んでいます。この問題に関連するリンクや、データベース設計に関する「必読」の記事をいただければ幸いです。ありがとう!

編集:最初に、私はグーグルの「継承マッピング」が必要であることに気づきました。これは、同様の質問をしている他の人を助けるかもしれません。問題を解決するために、私は#2と#3のハイブリッドを使用することになりました。それは実際には非常に簡単で、うまく機能し、EAVの複雑さなしに追加の機器タイプを追加する問題を解決します。すべてのコメントと提案をありがとう!

4

4 に答える 4

5

オプション1、2、および3には、非常に重大な欠陥が1つあります。誰かが新しい属性を思いついたときに、基になるテーブルスキーマを変更する必要があります。オプション1の場合、新しい機器タイプが導入される可能性があるため、問題はさらに複雑になります。属性のセットが常に固定されていることをどの程度確信していますか?停止したり、クライアントに「いいえ、新しい属性を設定することはできません」と言って、どれほど幸せになりますか?

一般的な属性からクエリを実行する可能性が非常に高い場合は、3と4のハイブリッドを試してみてください。機器タイプではなく、属性タイプに分割して2のダッシュをスローします。これは、はるかに不安定に見えます。オプション4は、私が正しく理解していれば、オプション1の正規形バージョンであり、固有のすべての問題(まばらさおよび脆弱性)を解決します。

INVENTORY( id*, model, manufacturer, serial )
ATTRIBUTE( id*, name, type, description )
INVENTORY_FACT_STRING( inv_id*, attr_id*, value )
INVENTORY_FACT_NUMBER( inv_id*, attr_id*, value )
INVENTORY_FACT_LIST_STRING( inv_id*, attr_id*, ordinal*, value )

于 2012-07-21T04:10:13.933 に答える
3

代替案1、2、および3は、MartinFowlerの著書の1つと彼のWebサイトで概説されています。

単一テーブル継承(オプション1)

具体的なテーブル継承(オプション2、一種)

クラステーブル継承(オプション3)

私の好みはオプション3です。それぞれが物事の一般的なスキームの中でその場所を持っています。

EAVは、その場で新しい属性を追加することに非常にうまく対応します。しかし、データを有用な情報に変えるときになると、EAVデータベースは悪夢になる可能性があります。

私はもっ​​と長い答えを持っています、それは私が要求に応じて投稿します。

于 2012-07-21T08:37:25.930 に答える
1

あなたは定期的なデータベースの正規化に直面したと思います。次のようなテーブルが必要です。

Items -> Id, Name, Model, Brand Id
Brands -> Id, Name
Attribute Names -> id, name
Attribute Mappings -> Id, Names Id, Items Id, Attribute Description

複数の属性がある場合は、属性テーブルにリストし、製品IDなどに関連付けます。3番目の正規化された形式を考え出すようにしてください

データベースの正規化

于 2012-07-21T04:13:34.907 に答える
0

SQLデータベースを解決するのは難しい問題です。MySQLには素晴らしい答えはありません。

1)動作し、重要な機器タイプのビューを追加できます。結合の数を減らし、各フィールドでのクエリとインデックスを可能にします。

2)ビュー内でunionallクエリを使用できます。PostgreSQLとInformixにはテーブルの継承があります。

3)これは多くの場合実装上の選択です。ここでも、結合にビューを使用できます。

4)PostgreSQL、Informix、Oracle、IBM DB2、およびMS SQL Serverは、値のペアを実装するためのXMLデータ型をサポートしています。

より高いレベルでは、XMLで機器のメタモデルを開発できます。次に、このモデルを使用して、スキーマSQLクエリとCRUDコードを生成できます。

于 2012-07-21T04:07:45.313 に答える