MySQL>表结构

时间:2014-01-16 22:47:02

标签: mysql sql

我在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?

感谢您的帮助

2 个答案:

答案 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)

Meleneth回答了这个问题 - 然后吃了一惊并删除了答案(不确定原因)。

首先,类别中的course_id对于课程是否在'中是没有意义的。类别。

  

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

那是一个多对多的关系。在关系数据库(只能描述1对多关系)中重新呈现此方法的方法是使用中间表将多对多关系分解为2个一对多关系。外键' cat_id'在课程中也变得多余。

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

同样,如果一个用户可以有多个课程,并且可能一个课程可以有多个用户,那么这些表不应该有彼此的外键,而是一个链接它们的sperate表(user_id和course_id)。