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

是否可以使用具有多个值的列创建sqlite表?,sqlite,database-schema,Sqlite,Database Schema,例如,假设我有一个包含员工列表的表。 员工id是主键,我有员工的其他详细信息,如姓名、年龄等。 员工可以有多个电话号码。因此,它成为一个多值属性。 我们不知道员工有多少电话(联系电话) sqlite3中是否可能有多值属性? 或者有什么方法来适应这种情况 谢谢。您可以通过以下方法完成此任务: 创建一列以存储所有电话号码(这使得基于号码的查询变得困难,不推荐使用) 您可以为每个号码(phone1、phone2等)创建x列(您需要确定每个用户的最大电话号码) 您可以为电话号码创建单独的表,并将此表与员

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

sqlite3中是否可能有多值属性? 或者有什么方法来适应这种情况


谢谢。

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

  • 创建一列以存储所有电话号码(这使得基于号码的查询变得困难,不推荐使用)
  • 您可以为每个号码(phone1、phone2等)创建x列(您需要确定每个用户的最大电话号码)
  • 您可以为电话号码创建单独的表,并将此表与员工表链接。这允许您存储每个员工的不同电话号码列表(需要新表)

  • 选项3似乎是最灵活的,但是在大多数情况下,我看到了选项2的实现(通常人们的电话号码有限)。

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


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

    您可能还希望包括一个描述列,以便您可以了解每个电话号码是什么


    在关系数据库中,在一列中存储多个值是一个首要问题。请不要这样做。

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

  • 创建一个包含3列的新EmployeePhoneNumber表。EmployeePhoneNumberId、EmployeeId、电话号码和电话类型
  • 添加约束以将“类型”列限制为(移动、家庭..)之一 现在,您可以按类型将任意数量的电话号码添加到新表中。如果需要,按employeeId和类型查询


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

    选项3是唯一合理的解决方案。其他两种方法都违反了数据库的规范化原则,并且会使最终的编程变得更加困难。您应该真正尝试遵循Larry的建议。如果您无法更改数据库模式或说服其他人,那么非常欢迎您使用编码解决方案来解决问题。但说真的,听拉里说。谢谢你的评论。是的,选项3在模式规范化方面是最好的。然而,在电话号码的情况下,人们通常有一个或两个号码,许多系统设计为只处理这个号码。它还简化了查询并避免了在某些系统中很重要的连接。
    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.
    }