例如,假设我有一张包含员工清单的表格。 员工ID是主键,我有员工的其他详细信息,如姓名,年龄等。 员工可以拥有多个电话号码。因此,它成为一个多值属性。 我们不知道员工有多少电话(联系电话)。
是否可以在sqlite3中使用多值属性? 或者有什么方法可以适应这种情况吗?
感谢。
答案 0 :(得分:2)
您可以通过以下想法完成此任务:
选项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)
多值字段在数据库设计中被认为是非常糟糕的做法,因为它显示缺少正常形式"。相反,你应该:
现在,您可以按类型向新表添加任意数量的电话号码。按employeeId查询并输入,如果需要。
此选项不仅更灵活,而且可以节省数据库存储空间,因为您只会为实际存在的电话号码分配存储空间。