如何有效地实现父/子关系,其中子项继承父

时间:2015-06-24 01:48:38

标签: ruby-on-rails postgresql inheritance parent-child nosql

我会尽可能地尝试和简化,但是,如果您需要更多信息,请告诉我。

我正在使用Rails 4PostgreSQL

修改

  • 使用PSQL 9.3
  • 数据集不会经常更改,对于此特定表,可能只有15列

我的设计中有“核心”components,其默认属性值如下:

  • material = wood
  • color = blue
  • price = $ 1.52
  • dimensions = 3x2x5

这些“核心”components及其默认属性值由管理员管理,管理员可根据需要通过管理界面进行调整。

用户可以创建新的component_group,并预先填充可用的components。新组中的components都使用其“核心”component的默认属性值。

然后,用户可以修改该组包含的任何components的属性值。

我目前所做的是:复制每个“核心”component以创建具有“核心”相同属性值的新唯一记录。

我担心的是,这个应用程序可能会创建大量的记录;许多记录可能没有更改其默认属性值。虽然我不知道最终,但这似乎最终会成为一个性能问题(特别是当你认为在现实世界的情况下,components会有自己的关系,也可能需要重复) 。

我最初的想法是实现某种系统,只有在更改属性值时才会创建新的component记录,否则component_group引用“核心”component

所以我的问题是:

  1. 我目前的方法是否远程正确?
  2. 我的表现问题是否有效,或者对数据库无关紧要?
  3. 此类功能是否更适合NoSQLCouchDB数据库?
  4. 此类功能是否有特定名称?我看过Class-Table Inheritance / Multi-Table Inheritance,但我认为这不是我想要的。

1 个答案:

答案 0 :(得分:0)

您可以在子表中使用(大多数)相同的表定义和NULL值来默认为父行的相应列值。代码示例:

CREATE TABLE comp_template (  -- parent table 
  comp_template_id serial PRIMARY KEY
, material_id      int REFERENCES material
, color            enum
, ...           -- attributes may or may not be defined NOT NULL
);

CREATE TABLE comp_group (  -- container
  comp_group_id serial PRIMARY KEY
, comp_group    text NOT NULL
)

CREATE TABLE comp (  -- child table 
  comp_id          serial PRIMARY KEY
, comp_group_id    int NOT NULL REFERENCES comp_group ON UPDATE CASCADE
                                                      ON DELETE CASCADE
, comp_template_id int NOT NULL REFERENCES comp_template ON UPDATE CASCADE
, material_id      int REFERENCES material
, color            enum
, ...           -- like comp_template, but all attributes can be NULL

返回有效值的视图:

CREATE VIEW comp_effective AS
SELECT c.comp_id, c.comp_template_id
     , COALESCE(c.material_id, t.material_id) AS material_id
     , COALESCE(c.color, t.color) AS color
     , ...
FROM   comp c
JOIN   comp_template t USING (comp_template_id);

NULL存储 非常便宜

这假设你有一个很小的,大部分是静态的可能属性集。该解决方案高达几百个不同的属性(列),您不会每天添加另一个属性。 否则,请查看非结构化数据类型,例如hstorejsonb

可以comp_templatecomp之间使用继承,这是有意义的。 But consider limitations of the Postgres implementation first.

相关答案以及更多细节: