Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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_Sql Server 2008 - Fatal编程技术网

Sql server 避免数据库设计中列过多和复杂性的最佳方法

Sql server 避免数据库设计中列过多和复杂性的最佳方法,sql-server,database,sql-server-2008,Sql Server,Database,Sql Server 2008,库存物品: Paper Size ----- A0 A1 A2 etc Paper Weight ------------ 80gsm 150gsm etc Paper mode ---------- Colour Bw Paper type ----------- glass silk normal Tabdividers and tabdivider Type -------- Binding and Binding Types -- Laminate and l

库存物品:

Paper Size 
-----
A0
A1
A2 
etc

Paper Weight 
------------
80gsm
150gsm etc

Paper mode
----------
 Colour
 Bw

Paper type
-----------
 glass
 silk
 normal

Tabdividers and tabdivider Type
--------

Binding and Binding Types
--

Laminate and laminate Types
--
这些库存项目和这些都需要存储在发票表中

如何使用适当的RDBMS将它们存储在数据库中

根据我的意见,每个列表都有一个主表,并使用联接进行检索。但是,在数据库中添加太多表可能有点复杂

在根据发票存储所有这些信息时,这种规范化有点问题。这导致发票表中的列过多

另一种方法是将所有列放入一个包含更多列的表中,然后每一行将是它们的组合。。(黑客算法4列表,包含24条记录中的4项,这些记录将具有参考ID)


你认为哪一个最好?为什么

你最初的想法是正确的。任何声称四个表“有点复杂”和/或“太多表”的人都不应该做数据库工作。这就是RDBMS的设计(和调整)目的

这4项中的每一项都是某事物的单独属性,因此不能简单地将它们放入合并它们的表中。正如您所想,您可以从以下内容开始:

  • 纸张大小
  • 镇纸
  • 纸模
  • 纸型
这些是查找表,因此应该具有非自动递增的ID字段

这些字段将用作主要纸质实体的外键字段

或者,如果它们只能存在于某些组合中,则需要一个关系表来捕获/管理这些有效组合。但这四个纸质“属性”仍然是独立的表,它们是关系表的外键。有些人会在关系表上放置一个单独的ID字段,以便通过单个值唯一地标识组合。就我个人而言,我不会这样做,除非有一个技术要求,比如复制(或其他一些流程/特性),要求每个表都有一个字段键。相反,我只需要在指向那些纸质“属性”查找表的四个ID字段中创建PK。然后,这四个字段仍将进入任何纸质实体。在这一点上,主图纸实体表的外观将与没有关系表时的外观大致相同,不同之处在于,不是每个图纸“属性”表都有4个FK的单个ID字段,而是有一个FK的4个ID字段,指向关系表的主键

为什么不把所有的东西都塞进一张桌子里呢?因为:

  • 它违背了使用关系数据库管理系统将数据扁平化为非关系结构的目的
  • 随着时间的推移,这种结构更难发展
  • 这使得查找特定属性的所有图纸实体变得更加笨拙
  • 这使得查找特定属性的所有图纸实体的速度变慢/效率降低
  • 也许还有其他原因
编辑:
关于我在撰写上述内容时未涉及的新信息(如发票表等),应通过捕获这些组合的产品/库存表进行抽象。这就是我所说的主要纸质实体。发票表将只引用ProductID/InventoryID(仅作为示例),而Product/Inventory表将具有这些纸张属性ID。我不明白为什么这些属性会出现在发票表中

EDIT2:

关于“属性”查找表的ID,它们不应该自动递增的一个原因是它们的值应该取自应用层中的枚举。这些查找表只是提供“数据字典”的一种方式,以便数据库层能够洞察这些值的含义。

Hmm有意义。.我已经开始按照您解释的方式进行设计,在某些时候担心组合和数据冗余。.无论如何,我将继续这样做,我会回来发表评论,如果这最后最合适的话。同时,我需要考虑在前端的CRUD操作的复杂性和性能。我将很快更新这个…@杰伊关于“需要考虑CRUD操作中的复杂性和性能”:这是一个向后的方法。不要为单记录操作进行优化(而且这些操作无论如何也不会变得更复杂——我将添加一个EDIT2,以防万一)。正确完成的数据模型应该在大多数/所有情况下都能很好地工作。但是,随着时间的推移,随着发票和库存/产品表的增长,CRUD操作仍然会很好。但对大范围行的查询将受到影响。现在,为了节省2小时的工作而偷工减料,不值得花20多个小时来调试和修复它。