我目前有一个Users
表,其中包含以下列:
目前,我们正在Address
列中存储IP地址。继续前进,我们需要存储一个MAC地址。将它们存储在同一列中(两者都是varchar
)并使用另一列指示typeOfAddress int
的类型为1或2表示地址类型是一种好的做法。或者我应该创建一个单独的可空列(并将现有的列更改为可为空)
答案 0 :(得分:7)
不,这不是好习惯。几十年前我被告知的第一件事就是“计算机领域不应该用于多个目的”。否则你原则上无法知道它意味着什么,除非你有另一个指标字段,你可以将其用于其他价值类型,并且你正在引入完全不必要的误解风险。
答案 1 :(得分:1)
绝对创建一个单独的可空列。它将使您在此桌面上编写所有未来的SQL变得更加容易,并使整体上的所有内容更易于维护。
答案 2 :(得分:1)
那么,根据给出的信息,这取决于。
用户是否同时拥有IP地址和MAC地址?如果这样做,则需要将这些记录放在具有与用户记录的外键关系的单独表中。
检索怎么样?在检索有关用户的数据时,是否经常需要检索这些值?如果他们这样做,将它们存储在同一个表中是有意义的,并且每次都避免表连接。
我倾向于有两个单独的列,一个用于IpAddress
,另一个用于MacAddress
。通过这种方式,可以清楚地知道哪些数据位于哪个列中而无需查找另一列来计算出来。
答案 3 :(得分:0)
推荐这个结构:
因为它在第3个NF中。
在单个表中简单使用多个列的缺点是:
应该添加一个具有FK关系的AddressType表,以防止意外输入看起来有效但不是的有效的AddressType。
最重要的是,从理论上讲,每个AddressType都是一个单独的表,在UserId上链接到用户表;但对于提出的问题,这确实看起来有点过分。
答案 4 :(得分:0)
如果你认为你不会添加更多不同类型的地址,我的偏好就是拥有两列。我认为在概念上更简单,查询更简单。但是如果你认为你将要添加更多类型的“地址”(无论可能是什么),那么拥有5或6个不同的列可能并不理想。在这种情况下,我将使用一个地址列和一个address_type列,并创建一个定义地址类型的联结表。
答案 5 :(得分:0)
不是创建新列,而是创建一个新表Address和AddressType,链接到那些:
Users
foreign key address_id
Address
id
value (varchar)
foreign key adress_type_id
AddressType
id
name (varchar)
可能有点矫枉过正,但这是很好的规范化实践