Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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 您将如何实施“非常广泛”的;表“;?_Sql_Sql Server_Database - Fatal编程技术网

Sql 您将如何实施“非常广泛”的;表“;?

Sql 您将如何实施“非常广泛”的;表“;?,sql,sql-server,database,Sql,Sql Server,Database,假设您正在建模一个具有多个属性(2400+)的实体,远远超过给定数据库引擎(例如~1000 SQL Server)的物理限制。除了域/候选密钥外,您不知道这些数据点(哪些数据点最热门/最常用)的相对重要性,您将如何实现它 A) 对。(嘘……本机关系工具被扔出了窗口。) B) 直走过去。第一个表有一个主键和1000列,一直到极限。下一个表是1000,外键输入到第一个表。最后一个表是剩余的400,也是外键 C) 在ceil(n/limit)表格上均匀划出条纹。每个表都有偶数列,对外键控第一个表。80

假设您正在建模一个具有多个属性(2400+)的实体,远远超过给定数据库引擎(例如~1000 SQL Server)的物理限制。除了域/候选密钥外,您不知道这些数据点(哪些数据点最热门/最常用)的相对重要性,您将如何实现它

A) 对。(嘘……本机关系工具被扔出了窗口。)

B) 直走过去。第一个表有一个主键和1000列,一直到极限。下一个表是1000,外键输入到第一个表。最后一个表是剩余的400,也是外键

C) 在
ceil(n/limit)
表格上均匀划出条纹。每个表都有偶数列,对外键控第一个表。800800800

D) 还有别的

为什么

编辑:这更像是一个哲学/一般问题,与任何特定限制或引擎无关


编辑^2:正如许多人指出的那样,数据可能没有标准化。通常情况下,当时的业务限制使深入研究成为不可能。

在这方面没有太多知识的情况下,我认为一个拥有如此多属性的实体确实需要重新设计。我的意思是把大的东西分成逻辑上相连的小部分

我会旋转列并使它们成为行。您可以将其作为fkey返回到包含所有可能属性列表的查找表,而不是将包含属性名称的列作为字符串(nvarchar)

以这种方式旋转表示您:

  • 没有大量的表格来记录一个项目的细节
  • 没有太宽的桌子
  • 由于旋转,您只能存储所需的信息(如果您不想存储特定属性,则不需要该行)

我将使用一对多属性表以及实体的外键

乙二醇

实体:id

属性:id、实体id、属性名称、值

增加

或者说,“计算机科学中的所有问题都可以通过另一种间接方式来解决”

  • 我会经常看数据模型 更仔细一点。正常吗 形式?是否有属性组 应该按逻辑分组 一起进自己的桌子

  • 假设它是标准化的,并且 实体确实有2400多个属性,I 不会这么快就对他发出嘘声的 . 嗯,这是最好的, 最灵活的解决方案 你描述的情况。它提供了对稀疏数据的内置支持,并提供了良好的搜索速度,因为任何给定属性的值都可以在单个索引中找到


  • 对我来说,关键是这件作品:

    对这些数据点的相对重要性一无所知(哪些数据点最热门/最常用)

    如果您知道哪些字段更重要,我会将这些更重要的字段放在“本机”表中,让EAV结构处理其余字段


    问题是,没有这些信息,你真的是瞎开枪了。无论您有2400个字段还是只有24个字段,您都应该对数据点的含义(以及相对重要性,或者至少是逻辑分组)有所了解。

    最多可用于30000列。与EAV或XML相比,它的最大优点是可以与稀疏列结合使用,以便对公共属性进行非常高效的搜索。

    我希望使用垂直(增加行数)方法,而不是水平(增加列数)

    您可以像这样尝试这种方法

    表--id,属性\名称--属性\值


    这种方法的优点是,在引入新属性/列时无需更改/创建表。

    我的解决方案:进一步研究。具体而言,确定表格是否真正正常化(在2400列中,这似乎不太可能)

    如果没有,则重新构造,直到完全正常化(此时每个表可能少于1000列)

    如果已经完全正常化,则(尽可能)为每个属性确定大致的总体频率。将最常出现的属性放在实体的“主”表中,使用2或3个额外的表来显示填充频率较低的属性。(尝试将出现频率作为确定哪些字段应放在哪些表上的标准。)


    只考虑EAV对于人口稀少的属性(最好是根本没有)。

    它警告我这是一个意见问题。嗯,我不知道。是的,当我看到你的编辑时,我删除了我的“为什么CW”查询!这仍然是一个EAV变体,虽然这也是我提出的完全相同的答案。这将是理想的,但考虑到时间限制(当时),花时间研究“最终正确”的模型是不可能的。你说得对,有很多非规范化的列。不同方法的平衡很好!