Database design 数据库设计:多个“;选项“;表格与单个表格
我相信我们所有人都以这样或那样的形式看到了这种设计要求 软件需要为用户提供多种问题/设置的答案选项。这些选项位于数据库中。在一个大项目中,许多这样的问题很容易超过50个 现在 有50多张这样设计的桌子可以吗Database design 数据库设计:多个“;选项“;表格与单个表格,database-design,Database Design,我相信我们所有人都以这样或那样的形式看到了这种设计要求 软件需要为用户提供多种问题/设置的答案选项。这些选项位于数据库中。在一个大项目中,许多这样的问题很容易超过50个 现在 有50多张这样设计的桌子可以吗 CREATE TABLE [dbo].[Setting1] ( [ID] uniqueidentifier NOT NULL, [Name] varchar(max) NOT NULL ) CREATE TABLE [dbo].[Setting2] ( [ID] u
CREATE TABLE [dbo].[Setting1]
(
[ID] uniqueidentifier NOT NULL,
[Name] varchar(max) NOT NULL
)
CREATE TABLE [dbo].[Setting2]
(
[ID] uniqueidentifier NOT NULL,
[Name] varchar(max) NOT NULL
)
等等
然后通过外键链接这些表,如下所示:
CREATE TABLE [dbo].[UserSettings]
(
[UserID] uniqueidentifier NOT NULL,
[Setting1ID] uniqueidentifier NOT NULL,
[Setting2ID] uniqueidentifier NOT NULL
)
还是创建一个“主”选项表更明智
CREATE TABLE [dbo].[Setting]
(
[ID] uniqueidentifier NOT NULL,
[Name] varchar(max) NOT NULL
[SettingCode] int NOT NULL
)
除了在第一种情况下必须乘以结构相似的表,而在另一种情况下没有完整性约束之外,还有什么优点和缺点?像这样的问题总是会有主观的答案,但就我个人而言,对于这么多单独的设置,我可能会做一些横向的事情,比如将它们存储在XML文件中,并将其持久化到针对用户链接的DB(使用BLOB类型字段,这样就不会遇到任何varchar长度限制)
这样,您就可以加载它,将其反序列化到一个配置对象中,并以良好的编程方式访问设置,而无需编写大量的SQL或在每次需要检查某些内容时点击数据库。像这样的问题总是会有主观的答案,但就我个人而言,对于这么多单独的设置,我可能会做一些横向的事情,比如将它们存储在XML文件中,并将其持久化到针对用户链接的DB(使用BLOB类型字段,这样就不会遇到任何varchar长度限制)
这样,您就可以加载它,将它反序列化到一个配置对象中,并以良好的编程方式访问设置,而不必每次都写入大量SQL或点击DB来检查某些内容。我会选择最后一个选项,查找表,但命名方案略有不同 “设置”用于存储设置的各种名称/说明,每个名称/说明都有一个主键。然后,将用户绑定到另一个表中的设置。无限设置,无限用户/设置关系 背景 设置ID-主键
设置名称
用户设置 用户ID
SettingID我会选择最后一个选项,查找表,但命名方案略有不同 “设置”用于存储设置的各种名称/说明,每个名称/说明都有一个主键。然后,将用户绑定到另一个表中的设置。无限设置,无限用户/设置关系 背景 设置ID-主键
设置名称
用户设置 用户ID
SettingID嗯,我认为为X设置创建X表是一个非常糟糕的解决方案 我喜欢这样解决这个问题:
Users(UserID, ...)
Settings(SettingID, SettingFieldName, ...)
UserSettings(UserdID, SettingID, Value)
但我不知道这在理论上是否是正确的解决方案。我通常是这样做的,我认为这很好。嗯,我认为为X设置创建X表是一个非常糟糕的解决方案 我喜欢这样解决这个问题:
Users(UserID, ...)
Settings(SettingID, SettingFieldName, ...)
UserSettings(UserdID, SettingID, Value)
但我不知道这在理论上是否是正确的解决方案。通常我是这样做的,我认为这很好。这基本上被称为EAV,在数据稀疏的情况下非常有用。请参阅:单个表的性能往往更好。许多小表可能会浪费缓存空间,因为它们少于一个物理页。这本质上称为EAV,在数据稀疏的情况下非常有用。请参阅:单个表的性能往往更好。许多小表可能会浪费缓存空间,因为它们少于一个物理页。