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