是否可以使用具有多个值的列创建sqlite表?
例如,假设我有一个包含员工列表的表。 员工id是主键,我有员工的其他详细信息,如姓名、年龄等。 员工可以有多个电话号码。因此,它成为一个多值属性。 我们不知道员工有多少电话(联系电话) sqlite3中是否可能有多值属性? 或者有什么方法来适应这种情况是否可以使用具有多个值的列创建sqlite表?,sqlite,database-schema,Sqlite,Database Schema,例如,假设我有一个包含员工列表的表。 员工id是主键,我有员工的其他详细信息,如姓名、年龄等。 员工可以有多个电话号码。因此,它成为一个多值属性。 我们不知道员工有多少电话(联系电话) sqlite3中是否可能有多值属性? 或者有什么方法来适应这种情况 谢谢。您可以通过以下方法完成此任务: 创建一列以存储所有电话号码(这使得基于号码的查询变得困难,不推荐使用) 您可以为每个号码(phone1、phone2等)创建x列(您需要确定每个用户的最大电话号码) 您可以为电话号码创建单独的表,并将此表与员
谢谢。您可以通过以下方法完成此任务:
选项3似乎是最灵活的,但是在大多数情况下,我看到了选项2的实现(通常人们的电话号码有限)。您还可以创建一个可序列化的自定义类来存储多个联系人号码。然后可以将自定义类序列化为字节[],然后从字节[]提取ASCII字符串。您可以存储多个联系人号码的字符串,但在从数据库读回数据后,您必须对数据进行反序列化(与下面的过程相反)
这是关系数据库术语中的错误方法。相反,您应该创建一个单独的表来保存员工电话号码。该表将包含列employee\u id和phone\u number。每个员工在此表中可能有0条或更多记录,具体取决于您存档的电话号码数量 您可能还希望包括一个描述列,以便您可以了解每个电话号码是什么
在关系数据库中,在一列中存储多个值是一个首要问题。请不要这样做。多值字段在数据库设计中被认为是非常糟糕的做法,因为它显示出缺乏“标准形式”。相反,你应该:
此选项不仅更加灵活,而且可以节省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.
}