请教数据库达人(Sql Server 2005)
数据关系如下:
有类别Category1,Category2(简称c1,c2),每个c1下都有n个c2。
c1无重复数据,c2无重复数据。
请问下面几种建表方式,您一般用哪种,为什么?
方式一:
数据表tCategory1(包含列 c1Id int,c1 nchar(10)) 。主键:c1Id自增长(1,1)。
数据表tCategory2(包含列 c2Id int,c2 nchar(10)) 。主键:c2Id自增长(1,1)。
关系表rCategory(包含列 cId int,c1Id int,c2Id int)) 。主键:cId自增长(1,1)。外键:c1Id,c2Id。
说明:如果这样建表,以后程序中就要验证rCategory表中c1Id,c2Id是否有重复。
方式二:
数据表tCategory1(包含列 c1 nchar(10)) 。主键:c1。
数据表tCategory2(包含列 c2 nchar(10)) 。主键:c2。
关系表rCategory(包含列 cId int,c1 nchar(10),c1 nchar(10))) 。主键:cId自增长(1,1)。外键:c1,c2。
方式三:
数据表tCategory1(包含列 c1 nchar(10)) 。主键:c1。
数据表tCategory2(包含列 c2 nchar(10)) 。主键:c2。
关系表rCategory(包含列 c1 nchar(10),c1 nchar(10))) 。主键、外键:c1,c2。
建立一个自关联的表就可以了,像一棵树,而且可以无限扩展。多表维护会给业务带来麻烦。
给你一个实例:
CREATE TABLE [dbo].[ObjectCategory](
[C_ID] [int] IDENTITY(1,1) NOT NULL,
[C_Name] [nvarchar](50) NOT NULL,
[C_Alias] [nvarchar](50) NULL,
[C_Level] [int] NOT NULL,
[C_Code] [nvarchar](255) NULL,
[C_Parent] [int] NOT NULL,
[O_ID] [int] NOT NULL,
[O_Name] [nvarchar](20) NULL,
[O_Code] [nvarchar](255) NULL,
[UpTime] [datetime] NOT NULL,
[UpUser] [nvarchar](50) NULL,
[SortLevel] [int] NOT NULL,
[States] [smallint] NOT NULL,
[F1] [int] NOT NULL,
[F2] [int] NOT NULL,
[F3] [int] NULL,
[F4] [int] NULL,
[F5] [nvarchar](255) NULL,
[F6] [nvarchar](255) NULL,
[F7] [nvarchar](255) NULL,
CONSTRAINT [PK_OBJECTCATEGORY] PRIMARY KEY CLUSTERED
(
[C_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
其中,SortLevel负责排序,C_Code负责编码,表示ParentID的父类编码,主要是查询用的.
数据是这样的:
ID,Name,ParentID,C_Code
1,第一级分类,0,'0'
2,第一级分类,0,'0'
3,第二级分类,1,'1'
4,第三级分类,1,'1/3'
***********
如果你的类别只有两级的话 那就只建两个表就行了
数据表tCategory1(包含列 c1Id int,c1 nchar(10)) 。主键:c1Id自增长(1,1)。
数据表tCategory2(包含列 c2Id int,c2 nchar(10), c1id int) 。主键:c2Id自增长(1,1),c1id 外键
如果是无限极分类的话 那就照楼上的建表吧