数组,EAV,自定义字段的序列化LOB?

时间:2010-10-11 19:26:37

标签: mysql field entity-attribute-value schemaless

我一直在尝试为在线应用程序的自定义字段回答复杂的Mysql数据结构问题。我是Mysql的新手,所以任何输入都值得赞赏。

当前数据库是一个关系数据库,该服务的每个用户将共享相同的数据库和表。

以下是我正在尝试做的一个例子。

假设我正在尝试创建一个列表。此列表最多可包含30个自定义字段。用户可以在12个唯一元素中进行选择,每个元素最多可以包含15个用户定义的属性。

每个列表在帐户内以及帐户之间都是唯一的。帐户可以有多个列表,每个列表可以具有不同数量的元素以及每个元素的不同属性。

元素可以是很多东西,例如:多项选择,单选按钮,电话字段,地址,单行文本,多行文本等。

多选(复选框)元素的属性示例可以是:红色,绿色,蓝色,橙色,白色,黑色

单行文本元素的示例可以是:名字输入字段。

每个元素还必须具有用户定义的标题字段和标记字段,可以在应用的其他功能中引用和使用。

分割也非常重要。用户需要能够基于任何元素对列表进行分段。例如,用户可能想要基于多选项元素#1中存在“红色”的所有记录来对列表“ABC”进行分段(它们可以具有多于1个列表的多项选择元素)。

在这个例子中,我假设数组,EAV,序列化LOB可以正常工作。但是,我不确定在我的规模上我的需求最好的结构是什么。

实际上,每个列表最多可能有50,000个记录,并且有超过20,000个帐户 - 每个帐户都有很多列表。因此,我正在寻找最有效和最灵活的结构。

为了使事情变得更加复杂,我还需要确保在任何给定时间向任何特定列表添加/删除元素的有效方法。例如,如果用户创建一个包含最大允许自定义字段数的列表(30),然后三个月后决定要删除一个字段,我需要一种方法来查找该列表以及该自定义字段的所有关联值然后删除所有值,元素类型及其属性。然后允许用户向该列表添加新元素。

我已经回顾了本网站上的许多EAV帖子,以及http://www.martinfowler.com/eaaCatalog/serializedLOB.html由于数据检索的缺点,EAV似乎不能满足我的需求。

我还想知道多维阵列在这种规模下的效果如何?我相信wordpress会将它用于自定义字段。

对于在这种情况下如何最好地构建数据库,将非常感谢任何输入。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以阅读有关FriendFeed如何实现自定义字段的信息: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

他们使用序列化LOB的组合,以及包含反向索引的额外表。您不需要为LOB中的每个可能属性添加额外的表,只需要您在索引的帮助下搜索的属性。

答案 1 :(得分:0)

你可以使用json enconding和解码(我假设你正在使用PHP)将输入信息存储在一个表中,其中包含用于存储用户的collumn以及用于将此数据存储为文本的其他数据。答案必须存储在另一个表中(使用FK以使用CASCADE ON DELETE)。

如果您可以指定输入规范的最大大小,请使用varchar字段。

这不是最好的aprouch(需要一些分析测试以确保它足够强大)但可以肯定使用。