首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >支持动态属性的架构

支持动态属性的架构
EN

Stack Overflow用户
提问于 2011-01-16 22:25:08
回答 1查看 9.3K关注 0票数 17

我正在开发一个编辑器,它可以让用户实时创建“对象”定义。一个定义可以包含零个或多个属性。属性具有名称和类型。创建定义后,用户可以创建该定义的对象并设置该对象的属性值。

因此,通过点击鼠标按钮,用户应该是ie。能够创建一个名为"Bicycle“的新定义,并添加类型为"Numeric”的属性"Size“。然后是另一个名为"Name“、类型为"Text”的属性,然后是另一个名为"Price“、类型为"Numeric”的属性。完成后,用户应该能够创建几个"Bicycle“对象,并填写每辆自行车的"Name”和"Price“属性值。

现在,我已经在几个软件产品中看到了这个特性,所以它一定是一个众所周知的概念。我的问题开始于我坐下来尝试提出一个DB模式来支持这个数据结构,因为我希望使用适当的列类型来存储属性值。即。在数据库中,数值属性值存储为INT,文本属性值存储为VARCHAR。

首先,我需要一个包含所有对象定义的表:

代码语言:javascript
复制
Table obj_defs

id | name      |
----------------
 1 | "Bicycle" |
 2 | "Book"    |

然后我需要一个表,用来保存每个对象定义应该具有的属性:

代码语言:javascript
复制
Table prop_defs

id | obj_def_id | name      | type |
------------------------------------
 1 |          1 | "Size"    |    ? |
 2 |          1 | "Name"    |    ? |
 3 |          1 | "Price"   |    ? |
 4 |          2 | "Title"   |    ? |
 5 |          2 | "Author"  |    ? |
 6 |          2 | "ISBN"    |    ? |

我还需要一个包含每个对象的表:

代码语言:javascript
复制
Table objects

id | created    | updated    |
------------------------------
 1 | 2011-05-14 | 2011-06-15 |
 2 | 2011-05-14 | 2011-06-15 |
 3 | 2011-05-14 | 2011-06-15 |

最后,我需要一个表来保存每个对象的实际属性值,一个解决方案是让这个表为每个可能的值类型都有一列,如下所示:

代码语言:javascript
复制
Table prop_vals

id | prop_def_id | object_id | numeric | textual | boolean |
------------------------------------------------------------
 1 |           1 |         1 |      27 |         |         |
 2 |           2 |         1 |         |  "Trek" |         |
 3 |           3 |         1 |    1249 |         |         |
 4 |           1 |         2 |      26 |         |         |
 5 |           2 |         2 |         |    "GT" |         |
 6 |           3 |         2 |     159 |         |         |
 7 |           4 |         3 |         |    "It" |         |
 8 |           5 |         3 |         |  "King" |         |
 9 |           6 |         4 |       9 |         |         |

如果我实现了这个模式,prop_defs表的“类型”列将包含什么?每个都映射到一个列名的整数,还是只包含列名的varchars?还有其他的可能性吗?存储过程在某种程度上会对我有所帮助吗?获取object 2的"name“属性的SQL会是什么样子呢?

EN

回答 1

Stack Overflow用户

发布于 2011-01-17 07:38:47

您必须承认,关系数据库并不擅长提供这种功能。他们可以提供它,但不擅长它。(我希望我错了)。关系数据库更适合已定义的接口,而不是更改接口。

--EAV表提供了动态字段,但性能很差。在索引上很烂。而且查询起来也很复杂。它在许多情况下都能完成工作,但在有大量用户访问系统的大型桌面上可能会崩溃。

--具有多个占位符列的“常规”表可以提高性能,但您得到的是非描述性列名,并且可以“添加”的列数受到限制。此外,它不支持子类型分离。

--通常在开发时创建/修改表,而不是在运行时。我们真的应该区别对待在运行时修改数据库吗?可能会,也可能不会。在运行时创建新的表、外键和列可以实现真正的动态对象,同时提供“常规”表的性能优势。但是,您必须查询数据库的模式,然后动态生成所有查询。那就太糟糕了。这将彻底打破表作为接口的概念。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4705860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档