自定义字段使用的是数组、EAV、序列化LOB?

8
我一直在尝试回答一个关于在线应用程序自定义字段的复杂Mysql数据结构问题。我对Mysql相当陌生,所以任何意见都会受到赞赏。
当前数据库是一个关系型数据库,服务的每个用户将共享同一个数据库和表。
以下是我正在尝试做的示例。
假设我正在尝试创建一个列表。此列表最多可以包含30个自定义字段。用户可以在12个唯一元素之间进行选择,并且每个元素可以具有多达15个用户定义的属性。
每个列表在帐户内部和帐户之间都可以是独特的。帐户可以拥有众多列表,每个列表可能具有不同数量的元素以及每个元素的不同属性。
元素可以是许多东西,例如:多选、单选按钮、电话字段、地址、单行文本、多行文本等。
多选(复选框)元素的属性示例可以是:红色、绿色、蓝色、橙色、白色、黑色
单行文本元素的示例可以是:名字输入字段。
每个元素还必须具有用户定义的标题字段和标签字段,可以在应用程序的其他功能中引用和使用。
分段也非常重要。用户需要能够基于任何元素对列表进行分段。例如,用户可能希望基于所有多选元素#1中存在“红色”的记录来分段列表“ABC”(他们可能有多个多选元素用于一个列表)。
在这个例子中,我会认为数组、EAV和序列化LOB都可以很好地工作。然而,我不确定什么结构最适合我的规模需求。
实际上,每个列表很可能有多达50,000条记录,并且有20,000多个账户-每个账户都有许多列表的真实可能性。因此,我正在寻找最有效和灵活的结构。
更复杂的是,我还需要确保以有效的方式在任何给定时间向任何特定列表添加/删除元素。例如,如果用户创建了一个具有最大允许自定义字段数量(30)的列表,然后三个月后决定删除一个字段,我需要一种方法来查找该列表和所有相关值的自定义字段,然后删除所有值、元素类型及其属性。然后,用户将被允许向此列表添加新元素。
我已经阅读了本网站上的许多EAV帖子,以及这个http://www.martinfowler.com/eaaCatalog/serializedLOB.html。由于数据检索方面的缺点,EAV似乎不太适合我的需求。
我还想知道在这种情况下,多维数组是否能很好地工作?我相信WordPress在其自定义字段中使用了这个。
非常感谢任何关于如何最好地为这种情况构建数据库的意见。谢谢!

我也面临着同样的挑战 - 你采用了什么解决方案?我非常感兴趣听听你的经验。 - philwilks
2个回答

3
您可以了解FriendFeed如何实现自定义字段:http://bret.appspot.com/entry/how-friendfeed-uses-mysql 他们使用序列化的LOB与包含反向索引的额外表的组合。您不需要为LOB中的每个可能属性创建额外的表,只需要为要通过索引搜索的属性创建表即可。

3
@wangyiran,这并不奇怪,那个博客已经有6年的历史了。我在这里的演示中描述了相同的倒排索引技术:http://www.slideshare.net/billkarwin/extensible-data-modeling。 - Bill Karwin
@BillKarwin 我建议每个人都查看那个带有幻灯片的链接。 - Andrii Abramov

0

你可以使用 JSON 编码和解码(我假设你正在使用 PHP)将输入信息存储在一个表中,其中包含一列用于存储用户,另一列用于将此数据存储为文本。答案必须存储在另一个表中(具有对使用 CASCADE ON DELETE 的外键)。

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

这可能不是最佳方法(需要进行一些分析测试以确保其足够强大),但肯定可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接