2011-11-22 111 views
0

例如,假设我有一张带有员工名单的表格。 员工ID是主键,我有员工的其他详细信息,如姓名,年龄等。 员工可以有多个电话号码。所以,它变成了一个多值属性。 我们不知道员工有多少电话(联系电话)。是否有可能创建一个具有多个值的列的sqlite表?

是否有可能在sqlite3中有多值属性? 还是有任何方法来适应这?

谢谢。

回答

2

您可以通过以下思路实现这一点:

  1. 创建1列来存储所有的电话号码(这使得基于数字查询难,不推荐)
  2. 你可以为每个数x列( phone1,phone2,...)(您需要决定每个用户的最大电话号码数)
  3. 您可以为电话号码创建单独的表,并将该表与foreign key的员工表链接。这允许您为每个员工存储各种不同的电话号码列表(需要新表格)。

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

+1

选项3是唯一合理的解决方案。其他两个都违反了数据库的标准化原则,并会导致编程更加困难。 –

+0

你应该在这里真正尝试遵循拉里的建议。如果您无法更改数据库模式或说服其他人,那么欢迎您使用编码解决方案来解决您的问题。但是,认真听取拉里的意见。 – Dubs

+0

感谢您的评论。是的,就模式规范化而言,选项3是最好的。但是,在电话号码的情况下,人们通常只有1或2个号码,而许多系统只能处理这些电话号码。它还简化了查询并避免了在某些系统中很重要的连接。 – dzida

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. 
} 
0

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

您可能还需要包含说明栏,以便您可以获得有关每个电话号码的信息。

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

0

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

  1. 用3列创建一个新的EmployeePhoneNumber表。 EmployeePhoneNumberId,EmployeeId,PhoneNumber和PhoneType。
  2. 添加一个约束,将Type列限制为(Mobile,Home ..)之一。

现在,您可以将任意数量的电话号码按类型添加到新表格中。根据需要通过employeeId查询并输入。

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

相关问题