首页 > 解决方案 > TSQL 表设计:如何在数据库表中表示“null 的原因”类别?

问题描述

我正在寻求有关如何最好地代表以下客户要求的任何建议或想法。这是一个相当长的帖子,所以希望这是正确的论坛 - 如果有更好的地方,很高兴得到纠正。

我有几种方法可以从技术上解决需求,但我正在尝试寻找一种有效的方法,因为大多数方法似乎都是一种妥协。

源数据

技术设计思想

1) 基于列的设计方案一

IE


CREATE TABLE dbo.DataSet1
(
    [RowID]         BIGINT IDENTITY(1,1) NOT NULL,
    [DataAttribute01] NVARCHAR (128) NULL,
    [DataAttribute01_ReasonForNull] TINYINT NOT NULL, -- FK to dbo.ReasonForNullCategoryType
    [DataAttribute02] DateTime NULL,
    [DataAttribute02_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03] UNIQUEIDENTIFIER NULL,
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03] [money] NULL,
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
)


CREATE TABLE dbo.ReasonForNullCategoryType
(
    [ReasonForNullCategoryTypeID]   TINYINT NOT NULL,
    [ReasonForNullCategoryTypeName] NVARCHAR (128) NULL,

)

INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(1, 'Not Null - a Legitimate Value')
INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(2, 'Null Value')
INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(3, 'Won't be known until a future date')
INSERT INTO dbo.ReasonForNullCategoryType([ReasonForNullCategoryTypeID],[ReasonForNullCategoryTypeName]) VALUES(4, 'Waiting for a response')


2) 基于列的设计方案二

IE

CREATE TABLE dbo.DataSet1
(
    [RowID]         BIGINT IDENTITY(1,1) NOT NULL,
    [DataAttribute01] NVARCHAR (128) NULL,
    [DataAttribute02] DateTime NULL,
    [DataAttribute03] UNIQUEIDENTIFIER NULL,
    [DataAttribute03] [money] NULL,
)

CREATE TABLE dbo.DataSet1_ReasonForNull
(
    [RowID]         BIGINT NOT NULL, -- same Id as in dbo.DataSet1 table
    [DataAttribute01_ReasonForNull] TINYINT NOT NULL, -- FK to dbo.ReasonForNullCategoryType
    [DataAttribute02_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
    [DataAttribute03_ReasonForNull] TINYINT NOT NULL, -- as above comment
)


3) 基于行的设计

每个“数据”列都可以表示为单独的行,属性名称列,nu​​ll 的原因有一个次要的“null 原因”列。

缺点是:

CREATE TABLE dbo.DataSet1
(
    [RowID]         BIGINT IDENTITY(1,1) NOT NULL,
    [DataAttributeName] NVARCHAR (128) NOT NULL,
    [DataAttributeValue] NVARCHAR (1024) NULL,
    [ReasonForNull] TINYINT NOT NULL, -- FK to dbo.ReasonForNullCategoryType table
)

搜索数据

任何想法都非常感谢。我更倾向于选项 1,但我敢肯定有很多我没有想到的选项,而其他人有!

谢谢。

标签: sql-serverdatabase-design

解决方案


推荐阅读