是否可以使用具有多个值的列创建sqlite表?

时间:2011-11-22 08:26:00

标签: sqlite database-schema

例如,假设我有一张包含员工清单的表格。 员工ID是主键,我有员工的其他详细信息,如姓名,年龄等。 员工可以拥有多个电话号码。因此,它成为一个多值属性。 我们不知道员工有多少电话(联系电话)。

是否可以在sqlite3中使用多值属性? 或者有什么方法可以适应这种情况吗?

感谢。

4 个答案:

答案 0 :(得分:2)

您可以通过以下想法完成此任务:

  1. 创建1列以存储所有电话号码(这使得根据号码进行查询很困难,不推荐)
  2. 您可以为每个号码(phone1,phone2,...)创建x列(您需要确定每个用户的最大电话号码数量)
  3. 您可以为电话号码创建单独的表格,并将此表格与员工表格foreign key相关联。这允许您为每个员工存储不同的电话号码列表(需要新表)。
  4. 选项3似乎最灵活,但在大多数情况下,我已经看到实施了选项2(通常人们的电话号码有限)。

答案 1 :(得分:0)

您还可以创建一个可序列化的自定义类来存储多个联系人号码。然后,您可以将自定义类序列化为byte [],然后从byte []中提取ASCII字符串。您将能够存储此多个联系号码的字符串,但是您必须在从数据库中读回数据后对其进行反序列化(逆转下面的过程。)

public class Contacts : ISerializable
{
}

if (Contacts is ISerializable)
{
    string contactNumbers = String.Empty;

    using (var stream = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, Contacts);
        stream.Close();
        var bytes = stream.GetBuffer();
        contactNumbers = System.Text.Encoding.ASCII.GetString(bytes));
    }

     //Perform the update for this column or add to your insert query.
}

答案 2 :(得分:0)

这是关系数据库术语中的错误方法。相反,您应该创建一个单独的表来保存员工电话号码。该表将包含employee_id和phone_number列。每个员工在此表中可能有0个或更多记录,具体取决于您存档的电话号码。

您可能还想要包含说明列,以便了解每个电话号码的信息。

在单个列中存储多个值是关系数据库中的一阶禁忌。请不要这样做。

答案 3 :(得分:0)

多值字段在数据库设计中被认为是非常糟糕的做法,因为它显示缺少正常形式"。相反,你应该:

  1. 创建一个包含3列的新EmployeePhoneNumber表。 EmployeePhoneNumberId,EmployeeId,PhoneNumber和PhoneType。
  2. 添加约束以将Type列限制为(Mobile,Home ..)之一。
  3. 现在,您可以按类型向新表添加任意数量的电话号码。按employeeId查询并输入,如果需要。

    此选项不仅更灵活,而且可以节省数据库存储空间,因为您只会为实际存在的电话号码分配存储空间。