Атрибуты объекта с несколькими типами в одной таблице - PullRequest
1 голос
/ 03 июля 2019

У меня такая ситуация: у меня несколько таблиц в одной таблице, и обычно мои столбцы зависят от типа объекта, например, крана, экскаватора и т. Д.

Моя проблема в том, что у крана есть другие параметры, чем у экскаватора, поэтомунесколько столбцов имеют значение null.Я думал, что могу сделать еще одну таблицу (attributes) и добавить связь между таблицей атрибутов и таблицей оборудования.Таблица attributes будет иметь id attributeName attributeValue equipmentId и, возможно, type (для определения типа значения в attributeValue).Это хорошая идея?Может быть, существует другое решение этой проблемы?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Это зависит от того, что вы делаете с этими таблицами.

Я могу представить себе следующие решения:

  1. Сохранить текущее решение.

    Это приводит к грязному определению таблицы, и вам, возможно, придется добавлять больше столбцов по мере поступления новых объектов, но значения NULL не занимают места в таблице PostgreSQL.

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

  2. иметь одну таблицу, содержащую только столбцы, общие для всех объектов, и для каждого объекта определитьтаблица с дополнительными столбцами.Эти таблицы имеют UNIQUE внешний ключ к таблице всех объектов.

    Это похоже на первое решение, но в итоге вы получите только соответствующие столбцы.

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

  3. Есть одна таблица для каждого типа объекта и никакой общей таблицы.

    Это сделает запросы, которые обращаются только к объектам одного типа, проще и быстрее, но вы не можете иметь внешние ключи, предназначенные для всех объектов.

  4. Иметь пустую таблицу со столбцами, общими для всех объектови иметь таблицу для каждого типа объектов, которая наследуется от общей таблицы.

    Это вариант 3., но он применяет общие столбцы и облегчает написание запросов для всех объектов.

0 голосов
/ 03 июля 2019

Вы представляете данные объекта в реляционной модели.

Предполагая, что для этого есть веские причины, рассмотрим am: n отношение X, которое связывает оборудование с атрибутами.

  • X может иметь атрибут instance для указания (идентификации) конкретной реализации объекта с его значениями атрибута.
  • Все значения экземпляра будут идти со столбцом value в X
    (возможно, несколько столбцов для разных типов данных, хотя вы можете использовать систему типов, нормализованную для строковых представлений, таких как XML-схема)
  • Тип / класс объекта будет соответствовать таблице оборудования, гдедругие атрибуты, представляющие отношения наследования, могут быть добавлены, хотя, вероятно, они при необходимости заслуживают своего отношения (таблицы).

Pro:

  • Атрибутымогут совместно использоваться объектами разных типов / классов.
  • Наборы атрибутов различных типов / классов объектов не обязательно должны находиться в подмножестве / надмножестве.Ион

Con:

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