MySQL>;表结构

MySQL>;表结构,mysql,sql,Mysql,Sql,我对SQL不是很精通 下面是我要使用的表的结构: 一个用户可以有多个课程 一门课程可以分为多个类别 一个类别可以包含多个课程 一个类别只能有一个父类别(也是一个类别) 我在这里看到了多个设置,其中第四个表链接了类别和课程 第一个问题: 我可以这样设置表格吗? 编辑:看起来糟透了,让我来解决这个 categories 第二个问题: 如何为每个类别输入多个课程id? 谢谢你的帮助梅勒内斯回答了这个问题,然后惊慌失措地删除了答案(不知道为什么) 首先,如果课程是“在”类别中,则类别中的课程id毫无

我对SQL不是很精通

下面是我要使用的表的结构:

  • 一个用户可以有多个课程
  • 一门课程可以分为多个类别
  • 一个类别可以包含多个课程
  • 一个类别只能有一个父类别(也是一个类别)
我在这里看到了多个设置,其中第四个表链接了类别和课程

第一个问题: 我可以这样设置表格吗?

编辑:看起来糟透了,让我来解决这个

categories 第二个问题: 如何为每个类别输入多个课程id?


谢谢你的帮助

梅勒内斯回答了这个问题,然后惊慌失措地删除了答案(不知道为什么)

首先,如果课程是“在”类别中,则类别中的课程id毫无意义

一门课程可以分为多个类别……一个类别可以包含多个课程

那就是一种多对多的关系。在关系数据库(只能描述1对多关系)中表示这种关系的方法是使用中间表将多对多关系分解为2个一对多关系。课程中的外键“cat_id”也变得多余

具体来说,您将创建一个表,其中cat_id和course_id作为字段(和主键)


类似地,如果一个用户可以有多个课程,并且一个课程可能有多个用户,那么这些表不应该彼此有外键,而应该有一个链接它们的速度表(用户id和课程id)。

您需要为三个“项目”中的每一个都有一个表然后是在类别、课程和用户之间建立多对一关系的表

注意:我个人倾向于用单数命名事物,并根据我的约束使用约定。如果你不理他们,我不会哭

注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])
)

谢谢@bluefeet,我不知道怎么让它看起来像这样!一个用户只能参加一门课程吗?@草莓,一个用户可以参加多门课程。(希望我能回答你的问题)那么课程id不应该出现在用户表中!如果这是为了实际生产使用(即使不是),您应该至少对密码进行加密和散列。他们的最后四个ssn也不应与他们的第一个、最后一个和出生日期一起存储。至于数据库结构,您将需要两个额外的表,一个将用户链接到课程,另一个将课程链接到类别,因为两者都是多对多关系。课程中有cat_id,用户中有course_id,这就形成了一对多的关系,这是不正确的。谢谢你的回答,我会这样做的。然而,就我个人而言,为什么我们不能有一个多对多的关系呢?这就是多对多的关系。如果你是说为什么不能用2个表而不是3个表来创建多对多关系……因为这样做是不可能的,而且要符合关系数据库的规则和结构。谢谢你的解释@symcbean非常感谢你的回答。即使我不理解所有的细节,我也理解这个概念,并会尝试复制它。好吧,我创建了两个表UserInCourse和CourseInCatergory,其中外键引用主键,但我似乎无法做到:约束[FK_Category_Category]外键([ParentId])引用[Category]([CategoryId]是因为它引用了同一个表吗?事实上,引用categoryid的外键parentid对我来说没有意义。你说过一个类别可以属于另一个类别,并且只能有一个父类别。这个约束是为了确保你输入到该字段的值本身就是一个类别id条目。这不是100%必要的但它不允许在该字段中输入无效条目,从而保持数据库的“干净”。感谢您的解释@Barry Colebank Jr 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      |
+---------+------------+----+-------+
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])
)