1

植物を表すモデルがあります。各植物にはタイプ (花、木、低木など) があります。植物の種類ごとに、一連の属性に対する異なる要件があり、そのうちのいくつかの植物は複数の値 (生息地、位置する地域など) を持つことができます。たとえば、樹木には複数の種類のライフサイクルがある可能性が低く、花には異なるライフサイクルがあります。


次の場所でデータをモデル化するにはどうすればよいですか。

  1. すべてのプラントは同じモデルにあります
  2. さまざまな種類の植物に一連の属性を適用する
    1. セット内のこれらの属性のうち、植物ごとに複数の値を持つことができるものもありますが、すべて少なくとも 1 つ必要です。
  3. 新しい植物の種類が追加されると、新しい属性、新しいセットを作成したり、古い属性を再利用したりする機能

これまでのところ、植物用の 1 つのテーブルがあり、それぞれのテーブル内の各属性と複数の多対多の関係があり、コードで少なくとも 1 つの値を適用します。

http://i.imgur.com/82CoW15.png


属性に Entity-Attribute-Value を使用することを考えましたが、使用している ORM (SQLAlchemy) の利点を実際には得られません。シリアル化された LOB と同じです。

クラステーブルの継承が必要だと思いますが、一部の属性が整然と複数の値を持つことができることに対処する方法がわかりません。

Plant                          Habitat
-----    |-->           -->    -------  --> Multiple values per plant
         |
         |      Flower         Life Cycle
         |-->   ------  -->    ---------- --> Single Value
         |
         |      Tree           Cone Type
         |-->   ----    -->    --------- --> Single value
         |
         |      Shrub
         |-->   -----

別の可能性は、実行時に新しい属性ごとに属性テーブルを追加することですが、SQLAlchemy またはその他の ORM 内でそれを達成する方法がわかりません

4

2 に答える 2

0

Look at the docs for joined table inheritance. The plant will a base class, and the flower, shrub, tree can have their own tables. each of the sub-plant tables can have whatever foreign key relationships are necessary.

于 2013-06-21T06:15:04.247 に答える
0

オブジェクト リレーショナル インピーダンス ミスマッチと呼ばれるものがあります。大まかに言えば、これは、データベース モデルで継承を使用しない方が満足できることを意味します。

ここでこれが可能/望ましいかどうかはわかりませんが、

植物の種類ごとに、一連の属性に対する異なる要件があり、そのうちのいくつかの植物は複数の値 (生息地、位置する地域など) を持つことができます。たとえば、樹木には複数の種類のライフサイクルがある可能性が低く、花には異なるライフサイクルがあります。

主な関心事が多重度(またはDBA 言語を話すカーディナリティ;) である場合、継承は必要ありません。「一対多」の関係だけが必要です。たとえば、それぞれplantを「1 対多」に関連付けることができますlife cycle

の各サブセットが、そのセットにとって意味plantのない1 つまたは多数の異なる属性を追加する場合、継承の利点を実際に活用できます。

その場合、SQLAlchemy には (少なくとも?) 3 つの選択肢があります。

  • 単一テーブルの継承: その場合、DB レベルでは、基本クラスのインスタンスを格納するテーブルは 1 つだけです。各インスタンスについて、必須フィールドのみが「使用」されます
  • 具体的なテーブルの継承: その場合、具体的なクラスごとに 1 つのテーブルがあります。
  • 結合されたテーブルの継承: 基本クラス用の 1 つのテーブルと、さまざまなサブクラスに必要な属性を追加するための「アドオン」テーブルがいくつかあります。

どちらのソリューションを選択するかは、ユース ケースと、ユーザー (および外部アプリケーション) が DB にクエリを実行する方法によって決まります。

于 2013-06-21T06:33:56.963 に答える