Есть ли шаблон DB / ORM для атрибутов? - PullRequest
0 голосов
/ 28 сентября 2010

Я хочу создать объект с другим значением ключа в качестве атрибутов, например:

animal
    id
    name

attribute
    id
    name

и отображение

animal_attribute
    animal_id
    attribute_id

так что я могу иметь запись "утка", которая имеет несколько атрибутов "полет", "плавание" и т. Д. Каждый тип атрибута будет иметь свою собственную таблицу, определяющую некоторые переменные

attribute_flying
    animal_id
    height
    length
    ..

attribute_swimming
    animal_id
    depth
    ..

есть ли лучший способ сделать это? Также как будет работать макет объекта в программировании (python)?

1 Ответ

4 голосов
/ 28 сентября 2010

У вас есть несколько альтернатив. Если у вас не очень глубокая иерархия объектов и только несколько атрибутов, вы можете создать одну таблицу и добавить столбцы для каждого атрибута, который вам необходим для поддержки

Другой способ - создать таблицу для каждого объекта и сопоставить каждый атрибут с другим столбцом.

Подход, который вы хотите использовать, не очень хорош из-за следующих проблем:

  1. Трудно проверить, существуют ли все необходимые атрибуты для животного.
  2. Трудно загрузить все атрибуты для животного. (на самом деле, если вы хотите загрузить несколько животных в одном запросе, вы застряли)
  3. Трудно использовать разные значения для атрибутов.
  4. Сложно составлять запросы.

На самом деле это так называемый антипаттерн Entity-Attribute-Value, как описано в книге SQL Antipatterns.

Чтобы разрешить этот антипаттерн, необходимо переосмыслить, как вы будете хранить свое наследие в базе данных. Есть несколько подходов:

  1. таблица для иерархии классов
  2. таблица для каждого подкласса
  3. стол для конкретного класса

Точное решение зависит от вашей задачи, в настоящее время трудно решить, какое решение является наилучшим. Возможно, вам следует использовать таблицу для каждого подкласса. В этом случае вы будете хранить общие атрибуты в одной таблице, а все специфичные для животного перейдут в дополнительную таблицу.

sqlalchemy поддерживает все три основных типа наследования, читайте о конфигурации наследования в документации и выбирайте то, что лучше для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...