Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何设计数据库以允许用户定义的模式_Sql Server_Database_Entity Framework_Schema_Entity Attribute Value - Fatal编程技术网

Sql server 如何设计数据库以允许用户定义的模式

Sql server 如何设计数据库以允许用户定义的模式,sql-server,database,entity-framework,schema,entity-attribute-value,Sql Server,Database,Entity Framework,Schema,Entity Attribute Value,如果您必须创建一个应用程序,比如博客应用程序,那么创建数据库模式相对简单。你必须创建一些表,tblpost,tblatachments,tblCommets,tblBlaBla…就这样(好吧,我知道,这有点简化了,但你明白我的意思) 如果您有一个应用程序,希望允许用户在运行时定义架构的一部分,该怎么办。假设您想要构建一个应用程序,用户可以在其中记录任何类型的数据。一个用户想要记录他的工作时间(开始时间、结束时间、项目Id、描述),另一个用户想要收集烹饪食谱,其他人可能需要股票报价,他们婴儿的每周

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

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

您将如何设计一个数据库来保存所有不同类型的数据?您是否会创建一个可以保存所有类型数据的通用模式,您是否会创建反映用户数据模式的新表,或者您是否有另一个很好的想法来实现这一点


如果这很重要:我必须使用SQL Server/Entity Framework,我只会给他们一份SQL Server Management Studio的副本,然后说:“快去吧!”为什么要在轮子中重新发明轮子呢?

表面上看,一个无模式或面向文档的数据库,比如自定义用户数据,听起来很理想。但是我想如果你不能使用SQL和EF之外的任何东西,那就没有多大帮助了。

我不熟悉实体框架,但我倾向于实体属性值()数据库模型

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


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

检查一下,您可以做到这一点,但这是一项艰巨的工作:)如果性能不是一个问题,xml解决方案也可以工作,尽管这也是一项艰巨的工作。

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

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

您甚至可以创建反向索引,以便在BLOB中的属性中查找特定值。请参阅(该技术适用于任何RDBMS,而不仅仅是MySQL)

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


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

我在我的书中写过EAV问题

这里有一个SO答案,我列出了实体属性值的一些问题:”

这是我前几天发布的一个关于EAV问题的博客:“


请务必阅读这篇“关于如何试图使一个完全灵活的数据库几乎毁掉一家公司”的博客。

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

这里有一个关于你的理由:)


作为补充说明,我在几天内使用Linq2Sql构建了这种方法的原型,这是一个可行的解决方案。鉴于您已经提到了实体框架,我想看一下第4版及其版本,因为这是一种注入混合EAV模型而不污染EF模式的好方法。

这不是一个批评性的评论,但它可以帮助您节省一些时间,指出这是唐吉诃德圣杯类型的问题之一。在50多年的时间里,人们一直在寻求一个用户友好的数据库设计界面

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


如果我们的集体传统智慧能够帮助你突破障碍,我会感到惊讶。但这将是非常棒的。

与其重新实现sqlservers的“createTable”语句,不如由一个可能比你我都好的程序员团队在很多年前完成,为什么不以有限的方式向用户公开SQLSERVER呢?让他们以有限的方式创建自己的模式,并利用SQLSERVER的强大功能来正确地完成它

让我们再试一次

如果您希望他们能够创建自己的模式,那么为什么不使用createtable语句来构建模式呢。您有一个完整、功能齐全、功能强大的数据库,可以完成定义模式和存储数据等惊人的任务。为什么不使用它呢

如果你只是想做一些特殊的属性,那当然

但如果是“全权委托,他们想做什么就做什么”,那就让他们去做吧

他们必须知道SQL吗?不,那是你的UIs任务。作为工具和应用程序设计器,您的工作是对用户隐藏实现。所以,如果你想建立关系,那么就列出字段、线条和箭头等等

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

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

<