说我有一组数据。这是某些城市的一组房屋。
House 1 | 123 Fake St | Notatown
House 2 | 456 Not Rd | Notatown
House 3 | 789 Foo Cres| Barville
...
然后想象一下,这样的数据就像这样有很多记录。
最好将它直接导入到一个表中,每个房子都有一个记录,并将城镇完整 - 或者创建一个存储id和城镇名称的关系表,并且必须将其插入到多个表?即:
1 | Notatown
2 | Barville
...
如果是的话,会考虑“正常形式”在上面的关系表中做什么?
答案 0 :(得分:0)
直接在house表中带有城镇名称的版本可以被认为是第二个普通形式(2NF),因为城镇的瞬态关系尚未移动到自己的表格中。
您是否需要将其重构为第三范式,实际上取决于您的要求。
答案 1 :(得分:0)
这完全取决于你将如何处理数据。
通常,将城镇名称存储在地址字段中并不是一个可怕的罪。你是正确的,更规范化的存储将是一个单独的“城市”表,用于查找城市值的键。当数据要更新时,这种结构更为重要。对于静态数据(和城市名称变化不大),它不太重要。
将城镇名称保留在一个表格中的优点是人们和可以下载地址表的技术较少的用户的可读性。
将城镇名称移动到另一个表的优点是一致性,可更新性以及数据库的ACID要求(原子性,一致性,隔离性和持久性)的保留。此外,如果城市名称往往超过四个字符,标准化版本可能会节省空间。 (后者在压缩列值的柱状数据库中不正确。)
在两个案例中,您需要对地点的替代拼写敏感。如果您有城镇的主列表,则使用该列表并突出显示不匹配的值。这也假设“城镇”不是您业务的核心。例如,为客户名称设置一个单独的表非常重要,因为您不希望拼写错误导致客户超额计算。