将数据保存为具有公共键和类型的一组键值对的选项

时间:2009-03-10 12:47:29

标签: database persistence agile

我正在努力编写另一个框架,以便更容易开发“bread'n'butter”应用程序(比如创建一个包含N个字段的类,获得免费的编辑器以及数据库持久性)。

所有数据模型都可以转换为Entity-Attribute-Value形式:

TYPE VARCHAR(32)
ID LONG INT
NAME VARCHAR(32)
VALUE VARCHAR(64000)

可能有一个非常大的字段的第二个表,所以我将VALUE列中的引用保存到BLOB表中的条目。如果我心情愉快,我可以为每个值类型创建一个表(因此int将是INTEGER,避免所有转换问题)并且我可以使用表来定义有效的TYPE等。

这将使我不必担心数据库设计,因为没有。通过使用简单的更新,数据库可以适应我的模型中的任何更改。我甚至可以在同一个类的实例中添加其他字段。

缺点是对于每个对象,我需要读取N行,或者我需要从构建包含N个子查询的复杂查询开始。

有没有人有这方面的经验?有没有人用这种方式实现更大的系统?除了普通的SQL之外还有哪些其他选项来保存数据?我特别喜欢听到敏捷系统,这些系统很容易采用模型中的变化或者允许“修补”模型(通常,实例会有一个名称,但对于某些人来说,我还想添加注释) 。或者有人在SQL后遇到过什么?下一件好事?

4 个答案:

答案 0 :(得分:1)

我没有使用它,但是你想要做的事情有点像CouchDB。在重新发明轮子之前你可能想看看那里......

答案 1 :(得分:1)

Amazon SimpleDB使用此方法。您定义了,并且每个域都包含一系列键/值对。这些数据称为“半结构化”。

这种方法有一些优势。与您的想法一样,您不需要定义数据库模式。您可以基于每行引入新表ad-hoc,新列,甚至包含具有多个值的列(而不是与额外表创建has_many关系)。如果架构发生更改,则可以过渡引入这些更改,而不是强制迁移。

另一方面,你在关系模型上抛弃了数十年的发展。你的出血速度会很快,因为你的索引要么过于笼统,要么不存在。聚合操作(组,联接)将非常缓慢。查询优化将很困难等等。

Amazon SimpleDB和Apache CouchDB都通过使数据库高度分布来解决这个问题。虽然这确保了可靠性和冗余性,但它有一系列问题,例如冲突解决和过时数据。

从您的问题来看,您似乎已经开始使用'敏捷'方法了,所以我建议使用这两个数据库引擎中的一个(取决于您是否愿意向亚马逊付费 - 尽管不是很多 - 或者建立自己的设置)。它们都允许完全动态的数据库模式。请注意陷阱。

答案 2 :(得分:0)

查看XML数据库(如eXist)。您可以通过修改xml架构轻松更改“datamodel”。您可以使用强大的查询语言,如XPath和XQuery。

答案 3 :(得分:0)

我从来没有基于这个原则建立整个应用程序,但在几乎所有应用程序中,我都使用某种形式的键值对集合来处理特定实体需要一些其他实体不需要的其他属性的极端情况。

我基本上将字典序列化并将其与我的实体数据一样存储在数据库中。这就是我用于后期制作补丁的时候,我必须处理一些过于模糊的东西,以保证整个模型的变化。

使用键值对数据,我也会存储类型,因此我可以自动呈现适当的HTML控件。我只有基本类型:文本,多行,RTF,复选框,数字和日期。