您将如何设计数据库以允许用户定义模式[关闭]

2024-04-15

如果您必须创建一个应用程序(例如博客应用程序),那么创建数据库模式相对简单。你必须创建一些表,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(使用前将#替换为@)

您将如何设计数据库以允许用户定义模式[关闭] 的相关文章

  • 实体框架验证的单元测试

    我正在尝试创建一个单元测试来验证实体框架对象 我找到了这个链接 https stackoverflow com a 11514648 2486661 https stackoverflow com a 11514648 2486661但对我
  • ASP.NET CLR 未启用

    当我运行我的应用程序时 在新安装的 ASP Net 和 SQL Server 上出现以下错误 Execution of user code in the NET Framework is disabled Enable clr enable
  • SQL Server 2008 排序规则冲突 - 如何解决?

    为了简化 POC 我使用字符类型列进行以下查询 select AH NAME1 from GGIMAIN SYSADM BW AUFTR KOPF union select AH NAME1 from GGI2014 SYSADM BW A
  • 从 varchar(50) 列表中查找值包含单词的行

    我正在从 t sql 存储过程收集数据以导入到 C 程序中 我想先缩小数据范围 我的数据包含三个字段 描述了它们后面的三个值 我只需要查找描述中具有十几个关键字之一的字段 我正在使用将所有字段与值联合起来的东西 然后 AND TEXT123
  • 带汇总总计和小计

    我有一个脚本可以生成几乎已经存在的结果集 我正在尝试获取小计和总计 我在年份栏中得到了小计 在最后得到了总计 我的目标是让最终结果显示 总计 而不是小计 请注意 由于汇总函数 我的最后一行 位置 也返回为空 SELECT YEAR COUN
  • Capybara+Selenium:如何在集成测试代码中初始化数据库并使其在 Rails 应用程序中可见?

    配置 使用 RSpec Capybara Selemium 驱动程序 SQLite 数据库对 Rails 项目进行集成测试 情况 我与 Capybara 和默认的rack test 驱动程序进行了一些集成测试 他们直接在数据库中创建用户注册
  • 如何在同一服务器上将数据库备份和恢复为副本?

    我有一个 SQL2005 Express 数据库 我想在同一实例上创建它的副本 您如何使用脚本来做到这一点 我已经有一个用于生成备份的脚本 但恢复失败 错误 消息 3234 16 级 状态 2 第 2 行 逻辑文件 MyDB data 不是
  • 使用用户定义的表类型在 SQL 中插入和更新

    以下是我创建的新数据类型 CREATE TYPE dbo UpdateHotelTableType AS TABLE ID int NULL HotelID int NULL FromDate datetime NULL 以下是我使用上述数
  • 无法在 Sql Server 中运行分析功能

    在 Oracle 中它运行良好 oracle的查询如下 SELECT TEAM ID LEVEL ID FF ID MODULE ID TERR ID MERGE KEY count distinct TERR ID over partit
  • ORA-02289: 序列不存在,hibernbate 中出错

    ORA 02289 序列不存在 hibernbate 中出错 在 Oracle 中 您无法自动生成值 您应该创建一个序列 我们称之为 VEHICLE SEQ 然后你应该把这个注释放在你的 id 上 GeneratedValue strate
  • 如何使用 ASP.net EF Codefirst 数据注释将 SQL Server 中的列设置为 varchar(max)?

    我一直在网上搜索 试图找出正确的语法 让 Entity Framework Code First 使用一列创建表 varchar max 这就是我所拥有的 默认情况下 这会创建 varchar 128 如何创建 varchar max 我尝
  • 使用一条语句在 MySQL 中添加多列

    我试图将多个列添加到 phpMyAdmin 中的现有表中 但我不断收到相同的错误 1064 你的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法 我在写信 ALTER TABLE WeatherCente
  • 存储库本身通常不经过测试?

    抱歉 我对存储库模式 单元测试和 orm 工具还不熟悉 我一直在研究单元测试和存储库模式 并得出一些结论 我想知道我是否正确 存储库模式有助于在使用它的控制器中替换单元测试 例如 对吧 因为创建上下文 在 EF 中 或会话 在 NH 中 的
  • 您可以在 EF5 中创建没有迁移的数据库吗?

    我正在关注官方 asp net 使用 MVC 4 开始使用 EF 5 在该教程中 数据库是在执行迁移时创建的 根据我的理解 当我查看 EF 5 with Mvc 5 教程时 他们没有使用迁移来创建数据库 他们使用数据库初始值设定项 所以 我
  • 不支持“数据源”关键字。 (ASP.Net 应用程序、实体框架 5、代码优先、迁移)

    我有一个 OData WCF 数据服务端点 ASP Net 站点 我想从使用以 SQL Server 2012 作为后端的 EF Code First 数据模型切换到以 LocalDB 作为后端的 EF Code First 数据模型 在我
  • 在JPA、关系型数据库等中,什么是Tuple? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在研究 Hibernate 和 JPA 并且一直在寻找这个术语 有人可以用实用和说教的方式向我解释一下这个术语是什么 以及它与 J
  • 用索引更新表太慢

    我正在观察我们应用程序的实时系统上的探查器 我发现我们定期 每秒 运行一条更新指令 速度相当慢 每次大约需要400ms 查询包含此更新 这是缓慢的部分 UPDATE BufferTable SET LrbCount LrbCount 1 L
  • MySQL:错误 1215 (HY000):无法添加外键约束

    我读过了数据库系统概念 第六版 西尔伯沙茨 我将在 OS X 上的 MySQL 上实现第 2 章中所示的大学数据库系统 但我在创建表格时遇到了麻烦course 桌子department好像 mysql gt select from depa
  • 使用 MOVE 确定 DB RESTORE 的 SQL 数据路径

    我正在尝试编写一个自动恢复数据库备份的脚本 我知道我可以使用以下 RESTORE 命令 RESTORE DATABASE DBRestoredName FROM DISK N C path to backup bak WITH FILE 1
  • 将列从日期转换为日期时间

    我有一个名为Lastmodified 数据类型为Date 但本来应该是DateTime 有没有办法转换列 当我使用 SQL Server Management Studio 的 设计 功能时 出现以下错误 不允许保存更改 您所做的更改需要以

随机推荐