Sql 您将如何实施“非常广泛”的;表“;?
假设您正在建模一个具有多个属性(2400+)的实体,远远超过给定数据库引擎(例如~1000 SQL Server)的物理限制。除了域/候选密钥外,您不知道这些数据点(哪些数据点最热门/最常用)的相对重要性,您将如何实现它 A) 对。(嘘……本机关系工具被扔出了窗口。) B) 直走过去。第一个表有一个主键和1000列,一直到极限。下一个表是1000,外键输入到第一个表。最后一个表是剩余的400,也是外键 C) 在Sql 您将如何实施“非常广泛”的;表“;?,sql,sql-server,database,Sql,Sql Server,Database,假设您正在建模一个具有多个属性(2400+)的实体,远远超过给定数据库引擎(例如~1000 SQL Server)的物理限制。除了域/候选密钥外,您不知道这些数据点(哪些数据点最热门/最常用)的相对重要性,您将如何实现它 A) 对。(嘘……本机关系工具被扔出了窗口。) B) 直走过去。第一个表有一个主键和1000列,一直到极限。下一个表是1000,外键输入到第一个表。最后一个表是剩余的400,也是外键 C) 在ceil(n/limit)表格上均匀划出条纹。每个表都有偶数列,对外键控第一个表。80
ceil(n/limit)
表格上均匀划出条纹。每个表都有偶数列,对外键控第一个表。800800800
D) 还有别的
为什么
编辑:这更像是一个哲学/一般问题,与任何特定限制或引擎无关
编辑^2:正如许多人指出的那样,数据可能没有标准化。通常情况下,当时的业务限制使深入研究成为不可能。在这方面没有太多知识的情况下,我认为一个拥有如此多属性的实体确实需要重新设计。我的意思是把大的东西分成逻辑上相连的小部分 我会旋转列并使它们成为行。您可以将其作为fkey返回到包含所有可能属性列表的查找表,而不是将包含属性名称的列作为字符串(nvarchar) 以这种方式旋转表示您:
- 没有大量的表格来记录一个项目的细节
- 没有太宽的桌子
- 由于旋转,您只能存储所需的信息(如果您不想存储特定属性,则不需要该行)
对我来说,关键是这件作品: 对这些数据点的相对重要性一无所知(哪些数据点最热门/最常用) 如果您知道哪些字段更重要,我会将这些更重要的字段放在“本机”表中,让EAV结构处理其余字段
问题是,没有这些信息,你真的是瞎开枪了。无论您有2400个字段还是只有24个字段,您都应该对数据点的含义(以及相对重要性,或者至少是逻辑分组)有所了解。最多可用于30000列。与EAV或XML相比,它的最大优点是可以与稀疏列结合使用,以便对公共属性进行非常高效的搜索。我希望使用垂直(增加行数)方法,而不是水平(增加列数) 您可以像这样尝试这种方法 表--id,属性\名称--属性\值
这种方法的优点是,在引入新属性/列时无需更改/创建表。我的解决方案:进一步研究。具体而言,确定表格是否真正正常化(在2400列中,这似乎不太可能) 如果没有,则重新构造,直到完全正常化(此时每个表可能少于1000列) 如果已经完全正常化,则(尽可能)为每个属性确定大致的总体频率。将最常出现的属性放在实体的“主”表中,使用2或3个额外的表来显示填充频率较低的属性。(尝试将出现频率作为确定哪些字段应放在哪些表上的标准。)
只考虑EAV对于人口稀少的属性(最好是根本没有)。
它警告我这是一个意见问题。嗯,我不知道。是的,当我看到你的编辑时,我删除了我的“为什么CW”查询!这仍然是一个EAV变体,虽然这也是我提出的完全相同的答案。这将是理想的,但考虑到时间限制(当时),花时间研究“最终正确”的模型是不可能的。你说得对,有很多非规范化的列。不同方法的平衡很好!