Правильные ассоциации и дизайн базы данных без наследования (одной таблицы) для Rails-Ember

Я изо всех сил пытаюсь понять, как спроектировать таблицы базы данных PostgreSQL и модели API Rails так, чтобы их ассоциации можно было реализовать 1:1 в моем интерфейсе Ember, благодаря чему Ember и Rails могут плавно взаимодействовать через общепонятный JSON. (Я использую ActiveModelSerializers на стороне Rails и ActiveModelAdapter на стороне Ember.)

Основная идея до того, как я начал писать любой код: примерная диаграмма классов

  • Product может быть Type1, Type2 и т. д., то есть подтипы наследуют product (я думал об этом как об абстрактном классе — ничто не должно быть просто продуктом)
  • каждый Type1 может иметь несколько Type2 как часть, и каждый Type2 может принадлежать нескольким Type1 через Type2_container
  • каждый класс Type имеет множество уникальных атрибутов, а также много общих атрибутов через класс Product.
  • Источник относится к одному продукту и одному магазину, т. е. продукты имеют много магазинов через источники.

Теперь проблема заключается в следующем: я не могу просто реализовать наследование, подобное этому, в Rails, которое поддерживает только наследование одной таблицы. С STI таблица Product будет иметь ширину более 50 столбцов, из которых только 10 или около того будут общими для классов-наследников. Не идеал...

С другой стороны, я не знаю, как создать простую связь 1:1 между Product и Type1/2/3, чтобы

  1. каждый продукт всегда указывает точно на одну из таблиц типов, и
  2. и Rails, и Ember Data знают, как интерпретировать эту связь между Product и Type1/2/3, так что каждый раз, когда я извлекаю/изменяю Product в Ember, я также извлекаю/изменяю его атрибуты, специфичные для Type.

Третий вариант, который я рассматривал, — таблица атрибутов со столбцами «имя», «значение_числа», «значение_int», «значение_логического значения» и «значение_текста». У продукта будет атрибут has_many, каждый атрибут будет принадлежать продукту. Это покончило бы с таблицами типов, но также привело бы к излишне большому количеству строк (например, 100 продуктов с 40 атрибутами в каждом = 4000 строк, а не только 200 с ассоциацией типа продукта). И это затруднило бы доступ к атрибутам продуктов (?).

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


person Ville Lehtinen    schedule 04.02.2017    source источник
comment
решено, см. ниже   -  person Ville Lehtinen    schedule 07.02.2017


Ответы (1)


Решил сделать Product полиморфным, идеально подходит под мой сценарий. Не нужно беспокоиться о наличии какой-либо таблицы базы данных для продукта, она просто работает. Этому руководству я следовал: emberigniter.com< /а>

person Ville Lehtinen    schedule 06.02.2017