正确的关联和数据库设计,无需对Rails-Ember进行(单表)继承



我很难弄清楚如何设计我的PostgreSQL数据库表和Rails API模型,以便它们的关联可以在我的Ember前端1:1实现,从而使Ember和Rails可以通过常见的JSON进行流畅的通信。(我在Rails端使用ActiveModelSerializer,在Ember端使用ActiveModelAdapter。)

之前的基本想法我开始写任何代码:粗略类图

  • 产品可以是Type1、Type2等,也就是说,子类型继承产品(我认为它是一个抽象类-没有什么应该是,只有产品)
  • 每个Type1可以有几个Type2作为其一部分,每个Type2可以通过Type2_container属于几个Type1
  • 每个Type类都有许多独特的属性,但也有许多通过Product类的常规属性
  • 来源是指一个产品和一个商店,即产品通过来源有多个商店

现在的挑战是:我不能在只支持单表继承的Rails中实现这样的继承。有了STI,Product表将有50多列宽,其中只有10列左右在继承类之间共享。不理想。。。

另一方面,我不知道如何在Product和Type1/2/3之间建立简单的1:1关系,以便

  1. 每个产品总是精确地指向类型表中的一个,并且
  2. Rails和EmberData都知道如何解释Product和Type1/2/3之间的关联,所以每次我在Ember中检索/修改Product时,我也会检索/修改它的Type特定属性

我考虑的第三个选项-具有列"name"、"value_num"、"value_int"、"value _boolean"one_answers"value _text"的属性表。产品将具有_many属性,每个属性都属于_产品。这将取消类型表,但也会导致不必要的大量行(例如,100个产品,每个产品有40个属性=4000行,而产品类型关联只有200个)。这将使访问产品属性(?)变得更加困难。

感谢您的帮助。此外,如果你想为我想要实现的目标建议一个完全不同的数据库/前端/后端,请这样做。我对这方面的大部分内容都很陌生,不知道不同方法的所有优点和缺点,我也不急于这样做。

决定使产品具有多态性,非常适合我的场景。不必担心有任何数据库表用于Product,它只是起作用。这是我遵循的指南:emberlinter.com

最新更新