如果您必须创建一个应用程序(例如博客应用程序),那么创建数据库模式相对简单。你必须创建一些表,tblPosts,tblAttachments,tblCommets,tblBlaBla…就是这样(好吧,我知道,这有点简化,但你明白我的意思)。
如果您有一个应用程序希望允许用户定义部分架构,该怎么办在运行时。假设您想要构建一个用户可以记录任何类型数据的应用程序。一个用户想要记录他的工作时间(开始时间、结束时间、项目 ID、描述),下一个用户想要收集烹饪食谱,其他用户可能想要收集股票行情、婴儿的每周体重、每月的食物支出、他们的结果最喜欢的足球队或任何你能想到的东西。
您将如何设计一个数据库来保存所有这些非常不同类型的数据?您会创建一个可以容纳所有类型数据的通用模式,您会创建反映用户数据模式的新表,还是您有另一个好主意来做到这一点?
如果它很重要:我必须使用 SQL Server / Entity Framework
您无法预测他们的数据需求有多复杂。实体-属性-值是许多程序员使用的一种典型解决方案,但它可能就足够了,例如,如果用户的数据通常使用多个表进行建模。
我会将用户的自定义数据序列化为 XML、YAML、JSON 或类似的半结构化格式,并将其保存在文本 BLOB 中。
您甚至可以创建倒排索引这样您就可以在 BLOB 中的属性中查找特定值。看http://bret.appspot.com/entry/how-friendfeed-uses-mysql http://bret.appspot.com/entry/how-friendfeed-uses-mysql(该技术适用于任何 RDBMS,而不仅仅是 MySQL)。
还可以考虑使用文档存储,例如Solr http://lucene.apache.org/solr/ or MongoDB http://mongodb.org。这些技术不需要遵守关系数据库约定。您可以在运行时向任何文档添加新属性,而无需重新定义架构。但这是一个权衡 - 没有架构意味着您的应用程序不能依赖于整个集合中相似的文档/行。
我是实体-属性-值反模式的批评者。
我在我的书中写过关于 EAV 问题的内容,SQL 反模式第 1 卷:避免数据库编程的陷阱 https://pragprog.com/titles/bksap1/sql-antipatterns-volume-1/.
这是一个答案,其中我列出了实体属性值的一些问题:“产品表,产品种类很多,每个产品都有很多参数 https://stackoverflow.com/questions/695752/#695860."
这是我前几天发布的博客,其中更多地讨论了 EAV 问题:“EAV FAIL https://karwin.com/blog/index.php/2009/05/21/eav-fail/."
请务必阅读此博客“恶业 http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/“关于如何尝试创建一个完全灵活的数据库几乎摧毁了一家公司。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)