Database design 数据库设计:多个“;选项“;表格与单个表格

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

我相信我们所有人都以这样或那样的形式看到了这种设计要求

软件需要为用户提供多种问题/设置的答案选项。这些选项位于数据库中。在一个大项目中,许多这样的问题很容易超过50个

现在

有50多张这样设计的桌子可以吗

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,在数据稀疏的情况下非常有用。请参阅:单个表的性能往往更好。许多小表可能会浪费缓存空间,因为它们少于一个物理页。