我必须创建一个数据库,结合4种类型的xls文件,例如A
,B
,C
和D
。每年都会创建一个新文件,从2004年开始。A
有7张800-1000行,B - D
有一张最多200行。
每个人都知道人们很懒,所以在excel文件中,地址数据在每张表中的存储方式都不同。其中一个,从2008年开始,将地址数据分开存储,但每个其他工作表都将这些数据合并为一列。
Sooo,这是一个问题 - 我应该如何设计数据表?像这样的东西?
+---------+----------+----------+-------------+--------------------------------+
| Street | House Nr | City | Postal Code | Combined Address |
+---------+----------+----------+-------------+--------------------------------+
| Street1 | 20 | Somwhere | 00-000 | null |
| Street2 | 98 | Elswhere | 99-999 | null |
| null | null | null | null | Somwhere 00-000, street3 29 |
| null | null | null | null | st. Street2 65 12-345 Elswhere |
+---------+----------+----------+-------------+--------------------------------+
会有很多空值,所以也许最好的解决方案是两个不同的表?
最重要的是用户将使用此数据进行搜索,并在将来将数据添加到该数据库中而不使用excel文件。
答案 0 :(得分:2)
这里至少有两种不同的视角:标准化和效率,导致不同的结果。
正常化
如果这是最重要的标准,你甚至可以制作三张桌子。显然Combined Address
需要它自己的位置,但Postal Code
和City
也必须存储到另一个表中,因为它们之间存在依赖关系。只有其中一个,很可能会留下Postal Code
。 (是的,甚至还有Street
和Postal Code
,但我显然不会迂腐。)
效率
归一化作为目的本身并不一定能产生最好的结果。如果你允许自己有点草率并且保持它在你发布的模型中的方式,那么编码就会变得更容易。您可以使用触发器确保Combined Address
永远不为空或使用假定它的(物化)视图,并暂时只在Combined Address
中搜索。
想象一下,如果您使用不同的表,并且需要在其他表中引用这些地址(在何时使用哪个表?如何提供唯一的ID?显然是一个问题。)。
所以,决定什么更重要。
如果我没有弄错的话,我们大约需要2000行或者大约8000行,如果它是'7张,其中每张'有800-1000行'。即使后者适用,这也不是使数据校正不可行的数字。如果组合列中不同输入模式的数量很少,您可以(部分)自动执行此操作,只需要一个证明读数。
所以你可能想要考虑未来的重新设计,并选择在这种情况下更方便的东西。