在数据库中动态保存不同的数据类型

时间:2014-05-19 10:41:52

标签: c# .net sql-server

假设我有一张表Person,我需要用户可以为他/她自己添加不同的属性。

用户应该能够添加datestringnumberbooleanmultiple值。

让我们说他想补充一下:

  1. 出生日期
  2. 名称
  3. Heigth
  4. 儿童姓名
  5. 我如何在数据库中保存这个?

    我有两个想法:

    1. 我可以将所有值保存为stringvarchar,并在使用时始终将值解析回原始格式。多个值保持为text1#text2#text3或类似。
    2. 有一个表,每个表都有列:日期,字符串,数字,只会填充所需的表,其他将保留为空。
    3. 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

良好的数据库设计应始终为N:1(多对一)或1:1(一对一),绝不是1:N(一对多)或N:N(许多)对很多人来说,这意味着如果你有一个用户的多个相关领域,你应该创建一个引用用户的新表。

由于用户只能有一个出生日期,因此您应该将其保留为Users表的列。

例如,在这种情况下,您希望子名称为“多个”,分配给一个用户。

一个简单的表格可能如下所示:

ID int primary key
UserID int references User(ID)
Name varchar

这样,您可以为一个用户创建多个子名称,同时仍然能够在数据库中保留约束(如果您通过应用程序与它连接,这有助于确保代码正确性!)

有些人会建议为每个值都有一个表,只是为了避免空值。例如,要存储他们的生日,您可以创建一个类似于上面的Children names表的表,因为您不必在Users表中创建一个可能为null的列。

我个人认为使用空值很好,因为它们允许您查看是否存在相关结果集而没有加入(或者更糟糕的是,左连接)整个可能无关信息的表。

答案 1 :(得分:0)

使用您的第二种方法。在您的表格' Person'中,每个记录都有一行,每个记录包含多个列,每个列包含所需字段的单个值。

所以..

tbPerson

ID    | Date Of Birth    | Name    | Height    | Childrens names    | etc...

创建表格......

CREATE TABLE tbPerson([ID] INT IDENTITY(1,1), [Date Of Birth] DATE, [Name] VARCHAR(50),     Height INT, [Childrens names] VARCHAR(250))

这是最好和最简单的方法,可以简单地编辑人员记录的1个字段。在你的第一种方法中,你会有无尽的噩梦,将所有东西都存放在一根长串中。