【问题标题】:Array, EAV, Serialized LOB for custom fields?自定义字段的数组、EAV、序列化 LOB?
【发布时间】:2011-04-23 23:38:39
【问题描述】:

我一直在尝试为在线应用程序的自定义字段回答一个复杂的 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 将其用于他们的自定义字段。

对于如何最好地针对这种情况构建数据库的任何意见,我们将不胜感激。谢谢!

【问题讨论】:

  • 我也面临着同样的挑战——你采用了什么解决方案?我会对你的经历非常感兴趣。

标签: mysql field entity-attribute-value schemaless


【解决方案1】:

您可以了解 FriendFeed 如何实现自定义字段: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

他们使用序列化 LOB 和包含倒排索引的额外表的组合。您不需要为 LOB 中的每个可能属性创建一个额外的表,只需要在索引的帮助下要搜索的那些。

【讨论】:

【解决方案2】:

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

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

这不是最好的方法(需要一些性能分析测试以确保它足够健壮),但肯定可以使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2018-06-27
    • 1970-01-01
    • 2015-01-27
    • 2020-07-19
    • 2017-02-04
    • 2018-07-12
    相关资源
    最近更新 更多