Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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
ul随时间推移。 如果我理解正确,您希望用户能够定义数据结构,然后将数据保存到这些结构中。您还希望能够查询它。 我认为可能还有其他两种方法可以做到这一点 使用XML怎么样?允许每个用户在每个“表”中存储一个XML文件,并只维护它的模式。每个“行”都是一个包含子元素的XML元素。您可以选择将XML粘贴到SQL中,或者通过其他方式存储它。这对于大型数据集来说效果不太好,但对于数千条记录来说,速度惊人地快;我在C#中用20+MB的XML文件做了一些测试,能够在不到1秒的时间内创建、读取和解析它们。使用LINQtoXML,您甚至可以构造相当复杂的查询和连接。我不会在大型企业系统中使用XML,但您会惊讶地发现,在拥有大量内存和快速处理器的现代机器上,XML能走多远,而且它具有无限的灵活性 你能改用面向对象的数据库(Matisse等)吗?我自己没有这方面的经验,但我认为您可以很容易地使用XML方法,但性能更好 AmazonSimpleDB:如果我没记错的话,这基本上是一个基于名称/值对的数据库,您可以使用它。您的应用程序是否可以在后台使用它来避免处理所有管道?如果您必须为SQL Server付费,那么AmazonDB可能会更便宜,并且有能力进行大规模扩展,但是没有关系查询之类的功能_C#_.net_Tsql_Database Design_Entity Attribute Value - Fatal编程技术网

ul随时间推移。 如果我理解正确,您希望用户能够定义数据结构,然后将数据保存到这些结构中。您还希望能够查询它。 我认为可能还有其他两种方法可以做到这一点 使用XML怎么样?允许每个用户在每个“表”中存储一个XML文件,并只维护它的模式。每个“行”都是一个包含子元素的XML元素。您可以选择将XML粘贴到SQL中,或者通过其他方式存储它。这对于大型数据集来说效果不太好,但对于数千条记录来说,速度惊人地快;我在C#中用20+MB的XML文件做了一些测试,能够在不到1秒的时间内创建、读取和解析它们。使用LINQtoXML,您甚至可以构造相当复杂的查询和连接。我不会在大型企业系统中使用XML,但您会惊讶地发现,在拥有大量内存和快速处理器的现代机器上,XML能走多远,而且它具有无限的灵活性 你能改用面向对象的数据库(Matisse等)吗?我自己没有这方面的经验,但我认为您可以很容易地使用XML方法,但性能更好 AmazonSimpleDB:如果我没记错的话,这基本上是一个基于名称/值对的数据库,您可以使用它。您的应用程序是否可以在后台使用它来避免处理所有管道?如果您必须为SQL Server付费,那么AmazonDB可能会更便宜,并且有能力进行大规模扩展,但是没有关系查询之类的功能

ul随时间推移。 如果我理解正确,您希望用户能够定义数据结构,然后将数据保存到这些结构中。您还希望能够查询它。 我认为可能还有其他两种方法可以做到这一点 使用XML怎么样?允许每个用户在每个“表”中存储一个XML文件,并只维护它的模式。每个“行”都是一个包含子元素的XML元素。您可以选择将XML粘贴到SQL中,或者通过其他方式存储它。这对于大型数据集来说效果不太好,但对于数千条记录来说,速度惊人地快;我在C#中用20+MB的XML文件做了一些测试,能够在不到1秒的时间内创建、读取和解析它们。使用LINQtoXML,您甚至可以构造相当复杂的查询和连接。我不会在大型企业系统中使用XML,但您会惊讶地发现,在拥有大量内存和快速处理器的现代机器上,XML能走多远,而且它具有无限的灵活性 你能改用面向对象的数据库(Matisse等)吗?我自己没有这方面的经验,但我认为您可以很容易地使用XML方法,但性能更好 AmazonSimpleDB:如果我没记错的话,这基本上是一个基于名称/值对的数据库,您可以使用它。您的应用程序是否可以在后台使用它来避免处理所有管道?如果您必须为SQL Server付费,那么AmazonDB可能会更便宜,并且有能力进行大规模扩展,但是没有关系查询之类的功能,c#,.net,tsql,database-design,entity-attribute-value,C#,.net,Tsql,Database Design,Entity Attribute Value,我曾经为一个系统做过一些事情,该系统以一种非常通用的方式存储数据,因此非常相似 该系统写得少,读得多,而获取数据的复杂连接使系统速度相当慢 现在我知道这违背了所有的数据库实践,但是,我对每个“表”的数据进行了非规范化,并在数据库中物理地创建了一个名为Table_1,Table_2的表 我基于Tables表上的触发器创建并删除了表_1和表_2,我使用TableColumns表上的触发器向这些表添加并删除了列,使用TableRows表上的触发器插入和删除了行,并使用TableValues表上的触发器

我曾经为一个系统做过一些事情,该系统以一种非常通用的方式存储数据,因此非常相似

该系统写得少,读得多,而获取数据的复杂连接使系统速度相当慢

现在我知道这违背了所有的数据库实践,但是,我对每个“表”的数据进行了非规范化,并在数据库中物理地创建了一个名为Table_1,Table_2的表

我基于Tables表上的触发器创建并删除了表_1和表_2,我使用TableColumns表上的触发器向这些表添加并删除了列,使用TableRows表上的触发器插入和删除了行,并使用TableValues表上的触发器更新了值

是的,正如预期的那样,我们的写操作性能大大降低了,但是我们的读操作性能(这在当时非常重要)大大提高了,因为我们可以直接从这些“非规范化”表中读取

因此,基本上您可以在示例中创建和删除表,并相应地添加和删除列。您可以创建所需的实际数据类型的列,然后可以在其中存储所需的任何内容


可能会使您编写的查询更容易,因为您只为用户查看一个表。

您在原始问题中显示的设计是设计的变体

有些人表达的不耐烦可能是因为事实上,几乎每个数据库开发人员都“发现”了这种设计,并试图将其完全用于您使用它的目的——一个支持可扩展数据库的灵活系统,而无需使用
CREATE TABLE
ALTER TABLE
带来的不便

但EAV有很多缺点。这里只有一个问题:您如何使任何给定的列成为强制性的(相当于
notnull
约束)

关系数据库假定您预先知道表,并且可以定义它们。RDBMS不是完全动态关系或具有完全可变属性集的关系的正确工具。还有许多其他技术可以实现这一点,例如XML或XML


另请参见我对“

的回答。您肯定希望简化此操作-允许您的用户创建表,可能是在TEMPDB中。只需在“createtable”d表前面加一个模式后缀,就可以避免它们阻塞实际的系统表。使您也可以轻松地筛选它们。问题是大多数数据库不允许非dba创建表,所以它需要一些预先设置。您甚至可以在数据库中专门为此创建一个模式,并在数据库支持的情况下对大小和表大小限制进行限制

不要重新发明轮子


这样做,您就可以自动获得连接、联合等,以及与Crystal Reports和其他工具的接口,而不需要使用特定的模式

SharePoint在SQL Server的基础上实现了这一点和更多功能。我将调查SharePoint是如何使用SQL Server的。

我投票支持您,作为将此信息发送给的激励。正如TheTXI所说,我们在每日WTF上一直看到这种“模式”。这是一个非常糟糕的主意。而且很搞笑。你真的应该坚持自己创建表格的原始想法。您可以始终添加安全约束,以便某些用户只能访问某些表等。这将比这少得多。@TheTXI:同意,这完全是对CREATE TABLE的重新发明。请不要轻视。这是一个值得讨论的有效问题。有一些类别的产品需要一定程度的灵活性,而为其设计一个好的设计并不是那么简单(当深入细节时)。这是一个Web应用程序,而不是桌面应用程序——为什么不制作一个网页,告诉人们使用MS Access呢因为我妈妈不会,我妹妹不会,老实说,我认识的人中没有一个不认为计算机正在普及的人会这么做。@kaster:这很公平,但我还是会保持我的答案,因为它可能会帮助别人为你找到更好的答案。@Rich B-我相信你和我,以及这里的所有人,使用谷歌文档、微软办公软件、开放式办公软件等电子表格,我们完全可以实现我们想要的——但信不信由你,大多数人都做不到。我不是要出发去
CREATE TABLE 'Tables' (
   Id INT NOT NULL PRIMARY KEY,
   NAME VARCHAR(255)
)

CREATE TABLE 'TableColumns' (
   Id INT NOT NULL PRIMARY KEY,
   TableId INT NOT NULL FOREIGN KEY ON 'Tables',
   NAME VARCHAR(255)
)

CREATE TABLE 'TableRows' (
   Id INT NOT NULL PRIMARY KEY,
   TableId INT NOT NULL FOREIGN KEY ON 'Tables',
   RowNumber INT NOT NULL
)

CREATE TABLE 'TableValues' (
   RowId INT NOT NULL PRIMARY KEY,
   ColumnId INT NOT NULL PRIMARY KEY,
   Value VARCHAR(255)
)
DATA_TABLE {
    TABLEID INT,
    INT1 INT,
    INT2 INT,
    VARCHAR1 VARCHAR(255),
    ... etc
}