16

如果您必须创建一个应用程序,比如博客应用程序,那么创建数据库模式相对简单。您必须创建一些表格、tblPosts、tblAttachments、tblCommets、tblBlaBla……就是这样(好吧,我知道,这有点简化,但您明白我的意思)。

如果您有一个应用程序,您希望允许用户在运行时定义部分模式,该怎么办。假设您要构建一个应用程序,用户可以在其中记录任何类型的数据。一个用户想要记录他的工作时间(开始时间、结束时间、项目 ID、描述),下一个想要收集烹饪食谱,其他人可能是股票报价、他们的婴儿每周的体重、他们每月花费的食物费用、他们的结果最喜欢的足球队或任何你能想到的东西。

你将如何设计一个数据库来保存所有非常不同类型的数据?你会创建一个可以保存所有类型数据的通用模式,你会创建反映用户数据模式的新表,还是你有另一个好主意来做到这一点?

如果它很重要:我必须使用 SQL Server / Entity Framework

4

9 回答 9

11

让我们再试一次。

如果您希望他们能够创建自己的架构,那么为什么不使用 CREATE TABLE 语句来构建架构,哦,我不知道。你有一个完整的、功能齐全的、强大的数据库,可以做一些很棒的事情,比如定义模式和存储数据。为什么不使用它?

如果您只是要做一些临时属性,那么当然可以。

但如果是“全权委托,他们可以为所欲为”,那就让他们来吧。

他们必须了解 SQL 吗?嗯,没有。那是你的 UI 任务。作为工具和应用程序设计者,您的工作是向用户隐藏实现。因此,如果您需要关系等,请提供字段、线条和箭头的列表。随便。

多年来,人们一直在制作“最终用户”、“简单”的数据库工具。

“如果他们想添加一列怎么办?” 然后添加一列,数据库会这样做,至少大多数好的。如果没有,则创建新表,复制旧数据,删除旧表。

“如果他们想删除一列怎么办?” 看上面。如果您无法删除列,则将其从用户的逻辑视图中删除,使其看起来已被删除。

“如果他们有 110 亿行数据怎么办?” 然后他们有 110 亿行数据,而操作比他们有 1 行数据的时间要长 110 亿倍。如果他们有 110 亿行数据,他们可能无论如何都不应该使用您的系统。

“在数据库上实现数据库”的魅力让我无法理解。

“我这里有Oracle,我怎么能提供更少的功能,让用户更慢??”

哎呀,我想知道。

于 2009-12-15T02:44:34.183 回答
10

您无法预测他们的数据需求会有多复杂。实体-属性-值是许多程序员使用的一种典型解决方案,但它可能就足够了,例如,如果用户的数据通常使用多个表进行建模。

我会将用户的自定义数据序列化为 XML 或 YAML 或 JSON 或类似的半结构化格式,并将其保存在文本 BLOB 中。

您甚至可以创建倒排索引,以便在 BLOB 的属性中查找特定值。请参阅http://bret.appspot.com/entry/how-friendfeed-uses-mysql(该技术适用于任何 RDBMS,而不仅仅是 MySQL)。

还可以考虑使用SolrMongoDB等文档存储。这些技术不需要遵守关系数据库约定。您可以在运行时向任何文档添加新属性,而无需重新定义架构。但这是一种权衡——没有架构意味着您的应用程序不能依赖于整个集合中相似的文档/行。


我是实体-属性-值反模式的批评者。

我在我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中写过 EAV 问题。

这是一个 SO 答案,我列出了 Entity-Attribute-Value 的一些问题:“产品表,多种产品,每个产品都有很多参数。”

这是我前几天发布的一篇关于 EAV 问题的更多讨论的博客:“ EAV FAIL ”。

并且一定要阅读这篇博客“ Bad CarRMa ”,了解如何尝试制作一个完全灵活的数据库几乎摧毁了一家公司。

于 2009-05-29T02:18:07.700 回答
5

我会选择混合实体-属性-值模型,所以就像 Antony 的回复一样,您有 EAV 表,但您也有始终存在的默认列(和类属性)。

这是一篇关于你在做什么的好文章:)

作为补充评论,我在几天内使用 Linq2Sql 为这种方法制作了一个原型,这是一个可行的解决方案。鉴于您提到了实体框架,我将看看版本 4 及其POCO 支持,因为这将是注入混合 EAV 模型而不会污染您的 EF 架构的好方法。

于 2009-05-29T02:26:21.427 回答
3

从表面上看,用于自定义用户数据的无模式或面向文档的数据库(例如CouchDBSimpleDB)听起来很理想。但我想如果你不能使用除了 SQL 和 EF 之外的任何东西,那也无济于事。

于 2009-05-29T00:20:11.883 回答
3

我不熟悉实体框架,但我倾向于实体-属性-值(http://en.wikipedia.org/wiki/Entity-Attribute-Value_model)数据库模型。

因此,您的应用程序将创建属性(或属性集合),然后您的最终用户将完成这些值,而不是动态创建表和列。

但是,正如我所说,我不知道实体框架应该为您做什么,它可能不会让您采用这种方法。

于 2009-05-29T00:26:15.930 回答
1

不是批评性评论,但它可能有助于节省一些时间来指出这是堂吉诃德圣杯类型的问题之一。大约 50 多年以来,人们一直在不断地寻求创建一个用户友好的数据库设计界面。

我能想到的唯一获得显着吸引力的准成功者是 1. Excel(及其前身),2. Filemaker(原始版本,而不是当前版本)和 3.(可能,但值得怀疑)Access . 请注意,前两个基本上仅限于一个表。

如果我们的集体传统智慧能帮助你打破障碍,我会感到惊讶。但这会很棒。

于 2009-05-29T03:22:33.030 回答
1

与其重新实现 sqlservers “CREATE TABLE” 语句,这是多年前由可能比你或我更好的程序员团队完成的,为什么不以有限的方式向用户公开 SQLSERVER —— 让他们创建他们以有限的方式拥有自己的架构,并利用 SQLServer 的力量来正确地完成它。

于 2009-12-15T02:41:38.493 回答
0

看看这篇文章你可以做到,但这是一项艰巨的工作:) 如果性能不是问题,那么 xml 解决方案也可以工作,尽管这也是很多工作。

于 2009-05-29T01:58:47.083 回答
0

我只会给他们一份 SQL Server Management Studio 的副本,然后说,“发疯!” 为什么要在轮中重新发明轮子?

于 2009-05-29T00:03:16.943 回答