我在SQL中不是很精明。
这是我想要使用的表的结构:
我在这里看到了多个设置,第4个表连接了类别和课程。
第一个问题: 我可以这样设置表吗?
编辑:看起来很糟糕,让我解决这个问题......
categories
+---------+------------+----+-------+
|Column |Type |Null|Default|
+---------+------------+----+-------+
|id |int(11) |No | |
|name |varchar(45) |No | |
|parent_id|int(11) |No |0 |
|course_id|int(11) |No |0 |
+---------+------------+----+-------+
courses
+---------+------------+----+-------+
|Column |Type |Null|Default|
+---------+------------+----+-------+
|id |int(11) |No | |
|name |varchar(45) |No | |
|cat_id |int(11) |No | |
+---------+------------+----+-------+
users
+---------+------------+----+-------+
|Column |Type |Null|Default|
+---------+------------+----+-------+
|email |varchar(45) |No | |
|password |varchar(45) |No | |
|firstname|int(11) |No |0 |
|lastname |int(11) |No |0 |
|birthdate|date |No | |
|ssn |int(4) |No |0 |
|course_id|int(11) |Yes |0 |
+---------+------------+----+-------+
第二个问题: 如何在每个类别中输入多个course_id?
感谢您的帮助
答案 0 :(得分:1)
您需要为您的三个“项目”中的每一个创建一个表格,然后在类别,课程和用户之间建立您想要的多对一关系的表格。
注意:我个人倾向于以单数形式命名事物以及为我的约束命名约定。如果你忽略它们,我不会哭。
注意2:这是mssql代码,我没有尝试在mysql中使用它,因为我没有实例,但概念是一样的,无论你使用哪个关系数据库。CREATE TABLE [dbo].[Category]
(
[CategoryId] INT NOT NULL,
[Name] VARCHAR(45) NOT NULL,
[ParentId] INT NULL,
CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED ([CategoryId] ASC),
CONSTRAINT [FK_Category_Category] FOREIGN KEY ([ParentId]) REFERENCES [Category]([CategoryId])
)
CREATE TABLE [dbo].[Course]
(
[CourseId] INT NOT NULL,
[Name] VARCHAR(45) NOT NULL,
CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([CourseId] ASC)
)
CREATE TABLE [dbo].[User]
(
[UserId] INT NOT NULL,
[Email] VARCHAR(45) NOT NULL,
[Password] VARCHAR(45) NOT NULL,
[FirstName] VARCHAR(45) NOT NULL,
[LastName] VARCHAR(45) NOT NULL,
[BirthDate] SMALLDATETIME NOT NULL,
[SSN] CHAR(9) NOT NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ([UserId] ASC)
)
CREATE TABLE [dbo].[UserInCourse]
(
[UserId] INT NOT NULL,
[CourseId] INT NOT NULL,
CONSTRAINT [PK_UserInCourse] PRIMARY KEY CLUSTERED ([UserId] ASC, [CourseId] ASC),
CONSTRAINT [FK_User_UserInCourse] FOREIGN KEY ([UserId]) REFERENCES [User]([UserId]),
CONSTRAINT [FK_Course_UserInCourse] FOREIGN KEY ([CourseId]) REFERENCES [PreferenceType]([PreferenceTypeId])
)
CREATE TABLE [dbo].[CourseInCatergory]
(
[CourseId] INT NOT NULL,
[CategoryId] INT NOT NULL,
CONSTRAINT [PK_CourseInCatergory] PRIMARY KEY CLUSTERED ([CourseId] ASC, [CategoryId] ASC),
CONSTRAINT [FK_Course_CourseInCatergory] FOREIGN KEY ([CourseId]) REFERENCES [Course]([CourseId]),
CONSTRAINT [FK_Category_CourseInCatergory] FOREIGN KEY ([CategoryId]) REFERENCES [Category]([CategoryId])
)
答案 1 :(得分:0)
首先,类别中的course_id对于课程是否在'中是没有意义的。类别。
课程可以分为多个类别......一个类别可以包含多个课程
那是一个多对多的关系。在关系数据库(只能描述1对多关系)中重新呈现此方法的方法是使用中间表将多对多关系分解为2个一对多关系。外键' cat_id'在课程中也变得多余。
具体来说,您将创建一个以cat_id和course_id作为字段(和主键)的表。
同样,如果一个用户可以有多个课程,并且可能一个课程可以有多个用户,那么这些表不应该有彼此的外键,而是一个链接它们的sperate表(user_id和course_id)。