0

我试图为我已经开始的项目设计一个MySQL数据库,但我无法弄清楚实现它的最佳方式。建模也存在父子关系的多种数据类型的存储

它是一个OOP系统,它包含不同类型的对象,所有这些对象都需要存储在数据库中。但是这些对象也需要保持彼此的父母子女关系。另外,我希望在系统投入生产时能够灵活地轻松添加新的数据类型。

据我所见,我有三个选择,一个是纯关系型,一个我认为是实体属性值(我没有正确理解EAV),最后一个是我认为的混合设计我自己,但我认为之前已经想过,并有一个专有名称。

关系设计将由两个表组成,一个包含列的大表允许其存储任何类型的对象,另一个表维护第一个表中行的父子关系。

EAV设计将有两个表,一个是具有三列(实体id,属性和值)的EAV表,然后第二个表将关联这些实体的父子关系。

混合设计将为每种类型的对象都有一个表,然后是一个父子关系表,它必须存储父,子的id以及这些id来自的表的某种标识符。

我确信这个问题已经被解决并且已经解决了好几百次,所以我会很感激任何参考资料,所以我可以阅读有关解决方案。

+0

不使用EAV。阅读Table Inheritance http://martinfowler.com/eaaCatalog/singleTableInheritance.html –

回答

0

是的,你可以很好地使用EAV设计。它适用于我们创建的应用程序,虽然经过约3年的改进。 您也可以使用一个通用的表结构,并为一组对象使用任何特定的表。或者只为每个对象创建一个通用表。 哪个表是哪个对象是元数据存储库的一部分。 如果您使用val_int,val_string类型的结构,则除了存储值的位置以外,您将有空列。您可能会考虑使用MS SQL的稀疏矩阵功能。现在磁盘大小有点便宜。因此,与传统结构相比,唯一的缺点是NxR行(表示对象的R属性)而不是N行。

除此之外,一些事情看出来的是对象实例的GUID,动态SQL生成...

1

这是唯一的真正关系设计:

CREATE TABLE Objects (
    object_id INT AUTO_INCREMENT PRIMARY KEY, 
    parent_object_id INT, 
    -- also attribute columns common to all object types 
    FOREIGN KEY (parent_object_id) REFRENCES Objects (object_id) 
); 

CREATE TABLE RedObjects (
    object_id INT PRIMARY KEY, 
    -- attribute columns for red objects 
    FOREIGN KEY (object_id) REFRENCES Objects (object_id) 
); 

CREATE TABLE BlueObjects (
    object_id INT PRIMARY KEY, 
    -- attribute columns for blue objects 
    FOREIGN KEY (object_id) REFRENCES Objects (object_id) 
); 

CREATE TABLE YellowObjects (
    object_id INT PRIMARY KEY, 
    -- attribute columns for yellow objects 
    FOREIGN KEY (object_id) REFRENCES Objects (object_id) 
); 

但MySQL不支持递归查询,所以如果您需要执行复杂的查询来获取整个树,您需要使用另一种方法来存储关系。我建议关闭表设计:

CREATE TABLE Paths (
    ancestor_id INT, 
    descendant_id INT, 
    length INT DEFAULT 0, 
    PRIMARY KEY (ancestor_id, descendant_id), 
    FOREIGN KEY (ancestor_id) REFRENCES Objects (object_id), 
    FOREIGN KEY (descendant_id) REFRENCES Objects (object_id) 
    -- this may need additional indexes to support different queries 
); 

我介绍更多关于闭包表在这里:

+0

你可以检查这个问题[一对2元组复合FK指向同一个表(封闭表格模式)](http:// dba。 stackexchange.com/questions/51764/pair-of-2-tuple-composite-fks-pointing-to-same-table-closure-table-pattern)。我想知道我的答案是否正确,或者有'UPDATE CASCADE'问题的解决方案。 –

+0

@ypercube,当然,我已经添加了一个答案。 –