例如,假设我有一张带有员工名单的表格。 员工ID是主键,我有员工的其他详细信息,如姓名,年龄等。 员工可以有多个电话号码。所以,它变成了一个多值属性。 我们不知道员工有多少电话(联系电话)。是否有可能创建一个具有多个值的列的sqlite表?
是否有可能在sqlite3中有多值属性? 还是有任何方法来适应这?
谢谢。
例如,假设我有一张带有员工名单的表格。 员工ID是主键,我有员工的其他详细信息,如姓名,年龄等。 员工可以有多个电话号码。所以,它变成了一个多值属性。 我们不知道员工有多少电话(联系电话)。是否有可能创建一个具有多个值的列的sqlite表?
是否有可能在sqlite3中有多值属性? 还是有任何方法来适应这?
谢谢。
您可以通过以下思路实现这一点:
选项3似乎是最灵活的,但在大多数情况下,我已经看到有选项2实现(通常人们有限数量的电话号码)。
您还可以创建一个可序列化的自定义类来存储多个联系号码。然后,您可以将自定义类序列化为一个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.
}
这是错误的做法关系数据库术语。相反,您应该创建一个单独的表来保存员工电话号码。该表将具有列employee_id和phone_number。每个员工可能在此表中有0个或更多记录,具体取决于您存档的电话号码数量。
您可能还需要包含说明栏,以便您可以获得有关每个电话号码的信息。
将多个值存储在单个列中是关系数据库中的一阶否定。请不要这样做。
多值字段在数据库设计中被认为是非常糟糕的做法,因为它显示缺少“正常形式”。相反,您应该:
现在,您可以将任意数量的电话号码按类型添加到新表格中。根据需要通过employeeId查询并输入。
此选项不仅更加灵活,而且它将节省数据库存储大小,因为您只会为实际存在的电话号码分配存储空间。
选项3是唯一合理的解决方案。其他两个都违反了数据库的标准化原则,并会导致编程更加困难。 –
你应该在这里真正尝试遵循拉里的建议。如果您无法更改数据库模式或说服其他人,那么欢迎您使用编码解决方案来解决您的问题。但是,认真听取拉里的意见。 – Dubs
感谢您的评论。是的,就模式规范化而言,选项3是最好的。但是,在电话号码的情况下,人们通常只有1或2个号码,而许多系统只能处理这些电话号码。它还简化了查询并避免了在某些系统中很重要的连接。 – dzida