如果您必须创建一个应用程序,比如博客应用程序,创建数据库模式相对简单。你必须创建一些表格,tblPosts,tblAttachments,tblCommets,tblBlaBla……就这样(好吧,我知道,这有点简化,但你明白我的意思)。
如果您有一个应用程序,希望允许用户在运行时**定义架构的一部分,该怎么办。假设您想构建一个用户可以记录任何类型数据的应用程序。一个用户想记录他的工作时间(startTime、endTime、projectId、description),另一个用户想要收集烹饪食谱,其他人可能会收集股票报价、婴儿的每周体重、每月食物支出、他们最喜欢的足球队的成绩或任何你能想到的东西。
你如何设计一个数据库来保存所有那些非常不同的数据?您会创建一个可以保存所有类型数据的通用模式吗?您会创建反映用户数据模式的新表吗?或者您有另一个很好的想法吗?
如果重要:我必须使用SQLServer/实体框架
9条答案
按热度按时间j2cgzkjk1#
让我们再试一次。
如果您希望他们能够创建自己的模式,那么为什么不使用create TABLE语句来构建模式呢。您拥有一个完整的、功能齐全的、功能强大的数据库,它可以做一些惊人的事情,比如定义模式和存储数据。为什么不使用它?
如果你只是想做一些特别的属性,那么肯定。
但如果是“全权委托,他们可以做任何他们想做的事”,那么就让他们去做。
他们必须知道SQL吗?嗯,不。这是你的UI任务。作为工具和应用程序设计师,您的工作是向用户隐藏实现。所以,如果你想建立关系,可以列出字段、线条和箭头等。
多年来,人们一直在制作“最终用户”、“简单”的数据库工具。
“如果他们想添加列,该怎么办?”然后添加一个列,数据库可以做到这一点,至少是最优秀的。如果没有,创建新表,复制旧数据,删除旧数据。
“如果他们想删除列,该怎么办?”见上文。如果您无法删除列,请将其从用户的逻辑视图中删除,使其看起来像已删除。
“如果他们有一百万行数据怎么办?”然后,它们有一千一百万行数据,而操作所花费的时间是一行数据的一千一百万倍。如果他们有1100万行数据,那么无论如何他们可能不应该使用您的系统。
“在数据库上实现数据库”的魅力令我难以忘怀。
“我这里有甲骨文,我怎么能提供更少的功能,让用户更快?”
哎呀,我想知道。
vmpqdwk32#
你无法预测他们的数据需求会有多复杂。实体属性值是许多程序员使用的一种典型解决方案,但如果用户的数据通常使用多个表进行建模,它可能就足够了。
我会将用户的自定义数据序列化为XML或YAML或JSON或类似的半结构化格式,并将其保存在文本BLOB中。
您甚至可以创建反向索引,以便在BLOB中的属性中查找特定值。请参阅http://bret.appspot.com/entry/how-friendfeed-uses-mysql(该技术适用于任何RDBMS,而不仅仅是MySQL)。
还可以考虑使用文档存储,如Solr或MongoDB。这些技术不需要符合关系数据库约定。您可以在运行时向任何文档添加新属性,而无需重新定义模式。但这是一个权衡——没有模式意味着你的应用程序不能依赖于整个集合中的文档/行是否相似。
我是实体属性值反模式的批评者。
我在我的书《SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming》中写过EAV问题。
这里是一个SO答案,我列出了实体属性值的一些问题:“产品表,多种产品,每个产品都有许多参数。”
这是我前几天发布的一篇关于EAV问题的博客:“EAV FAIL”
请务必阅读这篇博客“Bad CaRMa”,了解如何试图使一个完全灵活的数据库几乎摧毁了一家公司。
sg24os4d3#
我会选择一个混合实体属性值模型,所以像安东尼的回复一样,你有EAV表,但你也有默认的列(和类属性),它们将永远存在。
这里有一个great article,说明您的目的:)
作为补充,我在几天内用Linq2Sql为这种方法构建了一个原型,这是一个可行的解决方案。鉴于您已经提到了实体框架,我将看一看版本4和它们的POCO support,因为这将是一种很好的方法,可以在不污染EF模式的情况下注入混合EAV模型。
rxztt3cl4#
从表面上看,用于定制用户数据的无模式或面向文档的数据库(如CouchDB或SimpleDB)听起来很理想。但我想,如果你除了SQL和EF之外什么都不能使用,那就没什么用了。
2jcobegt5#
我不熟悉实体框架,但我倾向于实体属性值(http://en.wikipedia.org/wiki/Entity-Attribute-Value_model)数据库模型。
因此,与动态创建表和列不同,您的应用程序将创建属性(或属性集合),然后您的最终用户将完成这些值。
但是,正如我所说,我不知道实体框架应该为您做什么,它可能不会让您采取这种方法。
h79rfbju6#
这不是一个批判性的评论,但指出这是堂吉诃德圣杯式的问题之一可能会帮你节省一些时间。50多年来,人们一直在追求一个用户友好的数据库设计界面。
我能想到的唯一一个获得显著吸引力的准成功项目是1.Excel(及其前身)、2.Filemaker(原版,而非当前版本)和3.Access(可能,但令人怀疑)。请注意,前两个表基本上仅限于一个表。
如果我们的集体传统智慧能帮助你打破障碍,我会感到惊讶。但这将是美妙的。
wlp8pajw7#
与其重新实现SQLSERVER的“CREATE TABLE”语句(这是多年前由一组可能比你或我更好的程序员完成的),为什么不以有限的方式向用户公开SQLSERVER呢?让他们以有限的方法创建自己的模式,并利用SQLSERVER的能力来正确地完成它。
5fjcxozz8#
我只会给他们一份SQLServerManagementStudio的副本,然后说:“快疯了!”为什么要在车轮中重新设计车轮?
4si2a6ki9#
看看这个post,你可以做到,但这是一项艰巨的工作:)如果性能不是问题,那么xml解决方案也可以工作,尽管这也是一项艰巨工作。