如何高效实现子级继承父级属性的父子关系

问题描述 投票:0回答:1

我会尽力简化,但是,如果您需要更多信息,请告诉我。

我正在使用

Rails 4
PostgreSQL

编辑:

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

我有一个设计,其中有“核心”

components
,其默认属性值如下:

  • 材质=木头
  • 颜色=蓝色
  • 价格 = 1.52 美元
  • 尺寸 = 3x2x5

这些“核心”

components
及其默认属性值由管理员管理,管理员可以根据需要通过管理界面进行调整。

用户可以创建一个新的

component_group
,它将预先填充可用的
components
。新组中的
components
均使用其“核心”
component
的默认属性值。

用户随后可以修改该组包含的任何

components
的属性值。

我目前所做的是:复制每个“核心”

component
以创建一个具有与“核心”相同属性值的新唯一记录。

我担心的是,这个应用程序可能会创建大量记录;其中许多记录的默认属性值可能没有更改。虽然我不确定,但这似乎最终会成为一个性能问题(特别是当您考虑到在现实世界场景中,

components
将有自己的关系,也可能需要复制)。

我最初的想法是实现某种系统,其中仅当属性值发生更改时才会创建新的

component
记录,否则
component_group
会引用“核心”
component

所以我的问题是:

  1. 我目前的方法是否正确?
  2. 我的性能担忧是否有效,或者对数据库来说无关紧要?
  3. 这种类型的功能是否更适合像
    NoSQL
    这样的
    CouchDB
    数据库?
  4. 这种类型的功能有具体的名称吗?我看过
    Class-Table Inheritance
    /
    Multi-Table Inheritance
    但我不认为这就是我要找的。
ruby-on-rails postgresql inheritance parent-child nosql
1个回答
1
投票

您可以在子表中使用(大部分)相同的表定义和

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 存储非常便宜:

这假设了一组小的、大部分是静态的可能属性。该解决方案最多可有效处理数百个不同的属性(列),而您无需每天添加其他属性。 否则,请考虑非结构化数据类型,例如

hstore
jsonb

可以

comp_template
comp
之间使用继承。但首先要考虑Postgres 实现的限制

更详细的相关答案:

© www.soinside.com 2019 - 2024. All rights reserved.