【问题标题】:Naming Category and SubCategory Tables命名类别和子类别表
【发布时间】:2014-07-04 17:52:31
【问题描述】:

我正在尝试在数据库中创建一堆查找表,但在命名它们时被卡住了。表格是这样的:

 1. dbo.AccountType (this is the highest level category)
 2. dbo.AccountSubType (this is a 2nd level category)
 3. dbo.AccountSubSubType (this is a 3rd level category)

上述命名约定很容易被打破。所以也许这样更好:

 1. dbo.AccountType1 (highest level)
 2. dbo.AccountType2 (second level)
 3. dbo.AccountType3 (third level)
 4. dbo.AccountType-N (and so on...)

我知道命名约定是基于意见的,但肯定必须有某种合乎逻辑的方式来做到这一点,这种方式可扩展且不会让开发人员感到困惑。

使用第二种解决方案的dbo.AccountType2 表中的数据外观示例:

AccountTypeID (FK) | AccountType1ID (FK) | AccountType2ID (PK) | AccountType2
=============================================================================
1                    4                     1                     Credit Card
1                    5                     2                     Savings

有没有更好的方法将分层数据存储在数据库中并正确命名表?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这可能会更好地表示为具有层次关系的单个表:

    例如

    CREATE TABLE [dbo].[AccountType] (
        Id int NOT NULL
        ,ParentId int NULL
        CONSTRAINT [FK_AccountType_AccountType_Parent] REFERENCES [dbo].[AccountType] (Id)
        ,Name nvarchar(200) NOT NULL
        CONSTRAINT [PK_AccountType] PRIMARY KEY CLUSTERED ([Id])
    )
    

    然后用如下数据填充它:

    INSERT INTO dbo.AccountType (Id, ParentId, Name) VALUES (1, NULL, 'Credit Card')
    INSERT INTO dbo.AccountType (Id, ParentId, Name) VALUES (2, 1, 'Credit Card Sub-Type')
    INSERT INTO dbo.AccountType (Id, ParentId, Name) VALUES (3, 2, 'Credit Card Sub-Sub-Type')
    
    INSERT INTO dbo.AccountType (Id, ParentId, Name) VALUES (4, NULL, 'Savings')
    INSERT INTO dbo.AccountType (Id, ParentId, Name) VALUES (5, 4, 'Savingsd Sub-Type')
    INSERT INTO dbo.AccountType (Id, ParentId, Name) VALUES (6, 5, 'Savings Sub-Sub-Type')
    

    任何具有ParentIdNULL 的都是根值,否则它是指定父级的子级...

    编辑:要查询您将使用CTE。例如

    WITH ParentAccountType ( Id, ParentId, Name, ParentName )
    AS
    (
        SELECT Id, ParentId, Name, CAST('N/A' AS nvarchar(200)) AS ParentName
        FROM AccountType
        WHERE ParentId IS NULL
        UNION ALL
        SELECT c.Id, c.ParentId, c.Name, p.Name AS ParentName
        FROM
            AccountType c
            INNER JOIN ParentAccountType p ON c.ParentId = p.Id
    )
    SELECT ParentName, Name
    FROM ParentAccountType
    GO
    

    SQL 提琴手here

    【讨论】:

    • 自联接表。这很有趣。
    • 感谢这位院长。接受为答案。我实际上有一个遵循这种精确结构的表,完全忘记了自引用表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2012-10-14
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多