如何处理父/子关系和属性

时间:2016-04-02 20:29:02

标签: sql-server relational-database

我正在构建一个html标签和属性的数据库。 ul标签具有li标签作为父/子关系。 li标签具有'value'属性,因此它实际上不是父/子关系。 'value'是属性,而不是标签。

您如何设置表结构来处理父/子关系以及属性?

create table tag
(tagid int identity primary key
,tagName varchar(max)
)
go
create table prop
(propid int identity primary key
,parentid int
,childid int
)
go

我可以在'prop'表中添加另一个字段,以确定这是否真的是父/子关系或属性关系:

alter table prop
add typeid int

但我是从错误的道路开始的吗?

1 个答案:

答案 0 :(得分:1)

您需要的是三个表:Tag,TagProperty和TagToTagProperty。

  1. 表标记包含Html标记名称,其中包含对父标记的自我引用。
  2. TagProperty包含Html标记属性
  3. TagToTagProperty表是Tag和TagProperty之间的链接表,其中标记每个标记只能有一个不同的属性:PRIMARY KEY(TagId,TagPropertyId)
  4. 尝试下面的代码:

    CREATE TABLE Tag (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Name VARCHAR(126),
    ParentTagId INT NULL
    )
    
    GO
    
    CREATE TABLE TagProperty
    (
        Id INT IDENTITY(1,1) PRIMARY KEY,
        Name VARCHAR(126)
    )
    
    CREATE TABLE [dbo].[TagToTagProperty](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [TagId] [int] NOT NULL,
        [TagPropertyId] [int] NOT NULL
        CONSTRAINT PK_TagToTagProperty_TagId_TagPropertyId PRIMARY KEY (TagId, TagPropertyId)
    ) ON [PRIMARY]
    
    GO
    INSERT INTO TAG (Name, ParentTagId)
    VALUES('UL', NULL); --UL tag has no parent therefore ParentId is Null
    
    INSERT INTO TAG (Name, ParentTagId)
    VALUES('LI', 1); -- LI tag has a parent therefore parentId is one
    INSERT INTO TagProperty (Name)
    VALUES ('value')
    
    go
    /*
        Linking table between tag and attributes
    */
    INSERT INTO TagToTagProperty( TagId, TagPropertyId)
    VALUES 
    (1,1),
    (1,2)
    

    enter image description here