我会尽可能地尝试和简化,但是,如果您需要更多信息,请告诉我。
我正在使用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
,但我认为这不是我想要的。 答案 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存储 非常便宜 :
这假设你有一个很小的,大部分是静态的可能属性集。该解决方案高达几百个不同的属性(列),您不会每天添加另一个属性。
否则,请查看非结构化数据类型,例如hstore
或jsonb
你可以在comp_template
和comp
之间使用继承,这是有意义的。 But consider limitations of the Postgres implementation first.
相关答案以及更多细节: