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