在一个数据分析平台维护和开发(旧式)项目中,有一个名为is的表,其中有40+列,其中大约10列是层次结构的列。由于新特性的开发,层次结构还需要额外的10个级别,例如level11、level12、.,项目经理决定在现有的表A中增加20个新列。
层次数据类似于按国家和部门划分的收入描述:例如,
-level1的价值:USA 100 | JAPAN 200 | UK 300
-level2的价值:USA SOFTWARE 50 | USA HARDWARE 50 | OTHERS JAPAN 50 | ...
-level3的价值:SOFTWARE A 10 | SOFTWARE B 10 ... | HARDWARE A 100 | HARDWARE B 200 ...
每个级别的值是其父级别值的细分,没有冗余。所以它是标准化的,不是吗?
作为一名开发人员,我直觉地感到在现有的表中添加20个新列(已经有40+列)会让我感到不舒服。但是,当考虑使用40+列的当前表时,我无法用足够的理由反对在现有表A中增加20个新列的想法。
发布于 2021-10-18 20:34:48
据我所知,您一直遵循您的项目经理已经强加了一段时间的模式,做出这一决定可能有很有价值的原因,您是否尝试过问他为什么他们的DB管理设计会那样工作呢?老实说,我不认为用这种方式组织表格有什么意义,但同样,您的DBA同事可能会向您回答这个问题(我希望您能够与我们分享这个答案,为了相互了解,毕竟这就是这个社区的全部内容,如果涉及机密数据,您不需要这样做)。
在处理数据库时,我建议创建不同的表,每个表都有自己的用途,并由外键关联,但是如果您需要插入更多的列(因为在某些特定情况下,这种关系可能很难设计和处理),除了可读性之外,我不认为扩展这些表有什么实际的问题,这个问题是在更新现有列的属性时开始的,与任何编程语言一样,一个好的项目应该是可扩展的,但是它的属性不需要通过这种扩展来改变。
发布于 2021-10-19 08:37:07
列的数量是可以的。有时候你只是有很多专栏。但值得关注的是,你有很多相同的专栏。你实际上没有不同的数据,比如名字,姓氏,街道号码,街道名称,邮政编码,出生日期,雇佣日期,.-你所拥有的更像是名字1,名字2,名字3,名字4,名字5,名字6,名字7,.
在这种情况下(名与行之间的多对一关系),您应该创建一个FirstName表,该表的每个行都包含一个名,以及与其关联的行的ID。
如果一个单独的表的开销是不可接受的,并且您不需要在查询中使用名称,并且您不希望一行中有大量的名字,那么您可以使用一个FirstNames列来存储所有的名称,比如JSON。然后将整个名称集合作为一个值来处理,所以如果您有一个非常大的数字,它可能会很昂贵,而且数据库引擎不能有效地索引单个值,但是如果您不需要这些值,它也可以。
选项0(坏的原因是您的名字最多):
+------------------------------------------------------------------------------+
| TeamID | GoatsTeleported | FirstName1 | FirstName2 | FirstName3 | FirstName4 |
+------------------------------------------------------------------------------+
| 0 | 47 | Alice | Bob | Carol | Dave |
| 1 | 6542 | Eve | Frank | Grace | Heidi |
+------------------------------------------------------------------------------+备选案文1(最灵活,增加另一表):
+--------------------------+
| TeamID | GoatsTeleported |
+--------------------------+
| 0 | 47 |
| 1 | 6542 |
+--------------------------+
+--------------------+
| TeamID | FirstName |
+--------------------+
| 0 | Alice |
| 0 | Bob |
| 0 | Carol |
| 0 | Dave |
| 1 | Eve |
| 1 | Frank |
| 1 | Grace |
| 1 | Heidi |
+--------------------+选项2:(没有额外的表,但不能根据名字查询)
+------------------------------------------------------------+
| TeamID | GoatsTeleported | FirstNames |
+------------------------------------------------------------+
| 0 | 47 | ["Alice","Bob","Carol","Dave"] |
| 1 | 6542 | ["Eve","Frank","Grace","Heidi"] |
+------------------------------------------------------------+https://softwareengineering.stackexchange.com/questions/432782
复制相似问题