0

でアイテムのテーブルを作成したいと思いますDjango。問題は、すべての Item が異なる内部構造を持ち、作成するテーブルが多すぎることです。

たとえば、アイテムがCPU次のようになる場合、内部構造の属性 (列) が必要です。

type:processor
frequency:value
number of cores:value
socket:value

アイテムがsmartphone内部構造になる場合は、次のようになります。

type:smartphone
os:value
displaysize:value
cpuID:value

データベースに新しいアイテムを追加するとき、フィールドは最初にユーザーに追加したいタイプ (CPU など) を尋ね、この情報に従って、タイプに依存する内部構造属性の適切な形式を表示する必要があります。内部構造の特定のフィールドは必須ですが、そのほとんどはオプションであり、複数のフィールド (複数の URL など) があります。

これを実装するためのアプローチは何ですか?Djangoそのようなデータの助けはすでにありますか? さまざまなアプローチの長所と短所は何ですか? これまでのところ、欠点が 1 つあります。スマートフォンは cpuID を外部キーとして使用することに注意してください。参照を保存することは可能ですか? CPU はその製造元を参照できることに注意してください (さまざまなアイテムが他のアイテムへの参照をいくつか持つことができる例にすぎません)。

4

1 に答える 1

1

1 つの方法は、すべての共通プロパティを含む「メイン」テーブルを作成し、オブジェクトのタイプごとに個別のテーブルを作成することです。これは Django で行うのが非常に簡単で、モデル定義は「クリーン」に見えます。詳細については、複数テーブルの継承を参照してください。

あなたの状況のモデル例:

# Hold common fields/properties
class Item(models.Model):
    type = ...
    price = ...
    weight = ...
    width = ...
    height = ...
    ...

# Below are example classes which will inherit all properties from Item
class CPU(Item):
    frequency = ...
    core_count = ...
    socket = ...

class Smartphone(Item):
    os = ...
    display_size = ...
    cpu = models.ForeignKey(CPU, ...)  # Example linking between items.

各「具体的な」項目は、共通テーブルと「具体的な」テーブルの 2 つのデータベース行で構成されることに注意してください。2 つのテーブルは、「具体的な」テーブルの 1 対 1 のフィールドで結合されます (Django はこのフィールドを追加しますが、必要に応じて再定義できます)。

データベースからアイテムを取得するメソッドの例:

# Get all "base" items without touching type tables
Item.objects.all()

# Get all items along with their child properties. This is rather ugly and expensive.
Item.objects.select_related('cpu', 'smarthphone', ...).all()

# Gets smartphones, uses a join to retrieve data from two tables.
# I don't remeber if the `select_related` is required here.
Smartphone.objects.select_related('item').all()  

# When type of the item is only know at runtime, you can query like this (requires additional table column for storing type):
Item.objects.filter(type='smartphone')
# Or alternatively finding out which type class you want.

利点:

  1. クラス定義はすっきりとシンプルに見えます。
  2. 最適なデータベース構造に非常に近い。
  3. 1 つのデータベース クエリで、さまざまな種類のアイテムを取得できます。

短所:

  1. 完全なデータを含むオブジェクトを取得するときの過剰な結合。
于 2013-09-06T17:57:57.653 に答える