假设我有一张表Person
,我需要用户可以为他/她自己添加不同的属性。
用户应该能够添加date
,string
,number
,boolean
,multiple
值。
让我们说他想补充一下:
我如何在数据库中保存这个?
我有两个想法:
string
或varchar
,并在使用时始终将值解析回原始格式。多个值保持为text1#text2#text3
或类似。有什么建议吗?
答案 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个字段。在你的第一种方法中,你会有无尽的噩梦,将所有东西都存放在一根长串中。