我会尽力简化,但是,如果您需要更多信息,请告诉我。
我正在使用
Rails 4
和 PostgreSQL
编辑:
我有一个设计,其中有“核心”
components
,其默认属性值如下:
这些“核心”
components
及其默认属性值由管理员管理,管理员可以根据需要通过管理界面进行调整。
用户可以创建一个新的
component_group
,它将预先填充可用的 components
。新组中的components
均使用其“核心”component
的默认属性值。
用户随后可以修改该组包含的任何
components
的属性值。
我目前所做的是:复制每个“核心”
component
以创建一个具有与“核心”相同属性值的新唯一记录。
我担心的是,这个应用程序可能会创建大量记录;其中许多记录的默认属性值可能没有更改。虽然我不确定,但这似乎最终会成为一个性能问题(特别是当您考虑到在现实世界场景中,
components
将有自己的关系,也可能需要复制)。
我最初的想法是实现某种系统,其中仅当属性值发生更改时才会创建新的
component
记录,否则 component_group
会引用“核心”component
。
所以我的问题是:
NoSQL
这样的CouchDB
数据库?Class-Table Inheritance
/ Multi-Table Inheritance
但我不认为这就是我要找的。 您可以在子表中使用(大部分)相同的表定义和
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 实现的限制。
更详细的相关答案: