涉及动态字段的数据库结构

13

我正在进行一个项目,主要是为了学习目的。在掌握基础知识后,我发现实际尝试一个复杂的项目是学习语言的最佳方式。数据库设计不是我的强项,我开始研究它,但现在还处在初级阶段,我还在学习中。

这是我的Alpha架构,我真的只是想尽可能地记录我能想到的一切,并查看是否有任何问题跳出来。 http://diagrams.seaquail.net/Diagram.aspx?ID=10094#

我关心的一些问题,我想得到反馈:

请注意核心属性(例如区域),比如说,简单起见,区域可以是厨房、卧室、花园、浴室和客厅。但是对于另一个客户,可能是主页、联系页面、关于我们、闪屏等。它可以是2个区域,也可以是100个,没有必要限制它。

我为默认值创建了单独的表,并将每个表格都链接到了一个错误。后来,我遇到了自定义字段的问题,如果有人想标记Bug适用的主题,我们就没有这个选项,可能还有其他100个选项,所以我想坚持核心属性集,并且自定义字段使人们具有灵活性。

但是当我到达自定义字段时,我知道我有一个问题,我不能为每个自定义字段创建一个表,所以我使用了2个表。自定义字段和自定义字段值。这个想法是将包括默认值在内的每个字段都存储在此表格中,并将每个字段链接到只有这样的值的值表:

custom_fields table
id            project_id        name
01            1                 area(default)
12            2                 rooms(custom)
13            4                 website(custom)

custom_field_values table
id            area           project_id    sort_number
667           area1          1             1
668           area2          1             2
669           area3          1             3
670           area4          1             4
671           bedroom        2             1
672           bathroom       2             2
673           garden         2             3
674           livingroom     2             4
675           homepage       4             1
676           about_us       4             2
677           contact        4             3
678           splash page    4             4

这种处理动态字段的方式是否高效,还是有其他选择?

默认值将被硬编码,因此您可以使用它们或替换为自己的值,或者我可以创建另一个表格,允许用户编辑默认值的名称,该表格将与他们的项目关联。欢迎任何反馈,如果计划中存在明显的问题,请随时批评指正。


1
哎呀,EAV。如果我是你的话,我会看看NoSql的替代方案。 - Tony Hopkinson
2个回答

24

您重新发明了一个叫做 实体-属性-值 的旧反模式。在表中使用自定义字段的想法与关系型数据库逻辑上不兼容。关系 有固定数量的字段。

但即使它不是真正的关系型,我们有时仍然需要这样做。

有一些方法可以在 SQL 中模拟自定义字段,虽然其中大多数违反了规范化的规则。例如,请参见:


谢谢Bill,你能推荐一本书或资源,用例子来解释如何将我的设计转换为包含类继承的形式吗?我还不太明白它是什么以及如何在MySQL中实现它,但既然你建议在我链接的帖子中将其作为首选选项,我现在开始阅读它了。如果有一个在线资源或书籍可以为新手解释这个问题,我会很乐意购买的,到目前为止,我很难找到好的解释或例子。 - user1547410
《企业应用架构模式》(http://www.martinfowler.com/books/eaa.html)是Martin Fowler所著,是关于类继承和其他许多你应该了解的模式方面最好的书籍。 - Bill Karwin
谢谢,看起来我越看我的结构越适合使用Nosql数据库,虽然我以前没有用过,但它似乎是更合理的选择,有人不同意吗? - user1547410
是的,面向文档的数据库可以支持运行时定义的列,但请记住,非关系型数据库的设计要求您知道如何查询它。 - Bill Karwin

0

我在搜索类似的内容时发现了这个。因为客户可以提交自定义字段以供以后使用,所以我选择了使用 JSON 数据类型。我很欣赏这个问题被提出时 JSON 数据类型还没有存在。


你可能会喜欢我的演示文稿《如何错误地在MySQL中使用JSON》(链接:https://www.slideshare.net/billkarwin/how-to-use-json-in-mysql-wrong)。 - Bill Karwin
@BillKarwin 这只是一个极端的例子,如果你把它用在错误的场合,很容易让事情看起来不对劲。 - Luke Robertson
根据我在Stack Overflow上看到的开发者提问,我认为这并不罕见。他们将许多本不应该放在JSON中的数据放入其中。如果他们使用普通的表格和列,查询会更加容易。 - Bill Karwin

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