将不同数据存储在同一列中是一种很好的做法 - SQL

时间:2013-03-05 21:45:22

标签: sql

我目前有一个Users表,其中包含以下列:

  1. 用户ID
  2. 地址
  3. 目前,我们正在Address列中存储IP地址。继续前进,我们需要存储一个MAC地址。将它们存储在同一列中(两者都是varchar)并使用另一列指示typeOfAddress int的类型为1或2表示地址类型是一种好的做法。或者我应该创建一个单独的可空列(并将现有的列更改为可为空)

6 个答案:

答案 0 :(得分:7)

不,这不是好习惯。几十年前我被告知的第一件事就是“计算机领域不应该用于多个目的”。否则你原则上无法知道它意味着什么,除非你有另一个指标字段,你可以将其用于其他价值类型,并且你正在引入完全不必要的误解风险。

答案 1 :(得分:1)

绝对创建一个单独的可空列。它将使您在此桌面上编写所有未来的SQL变得更加容易,并使整体上的所有内容更易于维护。

答案 2 :(得分:1)

那么,根据给出的信息,这取决于。

用户是否同时拥有IP地址和MAC地址?如果这样做,则需要将这些记录放在具有与用户记录的外键关系的单独表中。

检索怎么样?在检索有关用户的数据时,是否经常需要检索这些值?如果他们这样做,将它们存储在同一个表中是有意义的,并且每次都避免表连接。

我倾向于有两个单独的列,一个用于IpAddress,另一个用于MacAddress。通过这种方式,可以清楚地知道哪些数据位于哪个列中而无需查找另一列来计算出来。

答案 3 :(得分:0)

推荐这个结构:

  1. 用户ID
  2. 地址类型
  3. 地址
  4. 因为它在第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)

可能有点矫枉过正,但这是很好的规范化实践