【问题标题】:Help needed on planning an SQL database规划 SQL 数据库所需的帮助
【发布时间】:2011-08-31 12:07:21
【问题描述】:

我是一名学习 SQL 和 PHP 的学生,我的任务是使用 PHP 和 mySQLi 创建一个学生反馈表,我真的一直在思考如何为项目设计数据库!

我正在创建一个系统,用户可以在其中登录网页,如果用户是学生,他们可以看到一个页面,为每个模块(班级)的每节课留下反馈。如果他们是导师,登录后他们可以查看反馈、添加包含课程数量的模块并添加学生帐户。

我不明白哪种方法是为数据库创建表的最佳方法,尤其是我知道您不能将表放在表中,我将有一个用于模块的表,并且在每个模块中将是每节课都有一个表格,该表格包含每个反馈项和一些其他变量,例如附加消息。

我如何在不创建数百个表并尝试将它们链接在一起的情况下构建我的数据库,因为我是 SQL 新手,这似乎是一种冗长不整洁的方式。

我这几天一直在研究数据库,但我不知道该怎么做!

【问题讨论】:

  • 查看链接表。这是您正在寻找的有关“嵌套表”的功能
  • 我强烈建议使用完全关系型数据库设计,但这意味着您将针对您可能需要的一些信息进行一些连接。所以这取决于你是否想这样做......
  • 你有没有尝试过什么,或者你只是在找人做你的功课?你知道如何使用外键吗?你教过标准化吗?如果您希望成为一名专业的程序员,您需要能够针对这个问题提出一些具体的解决方案,而无需得到答案。
  • 我已经为此苦恼了 3 天,我不是在找人做我的作业,我在寻求帮助。不,我没有被教过标准化,我开始认为我没有被教给我分配给我的作业所需的太多东西! :(

标签: php mysql database-design data-modeling


【解决方案1】:

数据库表之间的关系可以模仿您所描述的嵌套表。在数据库用语中,有 1 对 1 关系、1 对多关系和多对多关系。如果您想为单个模块创建多个类,您可以在 Class 表中拥有一个字段,该字段包含它所属的 Module 记录的外键。 (许多类到 1 个模块)。

如果您想将许多学生链接到一个班级并为一个学生开设多个班级,您通常会使用一个单独的表,该表只保存两个表的外键。也就是说,您有一个 Student_2_Class 表,它有一个 Class_FKey 字段和一个 Student_FKey 字段,有时这些多对多链接表在需要时还有其他字段。至少您会添加一个约束,即两个外键的组合是唯一的。这样你就不能把同一个学生多次放在同一个班级。

我不认为我可以教你如何在线程响应中设计数据库,但你应该能够搜索主键、外键、多对一、一对多、多对多等术语来查找事物。此外,您的学校图书馆可能有可能对您有所帮助的“数据建模”书籍(我喜欢 Simsion 和 Witts Data Modeling Essentials。Visio 有一个不错的实体关系图工具(数据库模型通常称为实体关系图) ) 所以你也可以找到在线教程来展示如何使用它,并且你可以通过观看来获得一些建模技巧。

【讨论】:

  • 感谢您的建议,我不完全遵循它,但我会像您建议的那样研究条款!
  • 祝你好运。数据库编程本身就是一门学科。 This tutorial page 对术语有很好的概述。在第一页之后,它会进入您可能不想要的 SQL 细节。您需要一本关于数据建模的优秀初学者教程,但我手头没有一本,如果你能找到一本。
  • 我马上就到了!感谢这里的帮助:) 我现在可以做我需要做的事情,它只是弄清楚如何处理错误或当某些事情不正确时。不过,当某些东西起作用时,真是太棒了!
【解决方案2】:

您不应该需要数百张桌子!但是,您需要使用主键链接它们。这就是 SQL 的精髓,不管你是不是新手,这正是你需要学习的。

本质上,您将一个表放在一个表中,但是您通过匹配键将它们链接在一起:

student_id  student_name
1           Bob
2           Jane

comment_id  student_id  comment_body
123         2           Jane says hi!
124         1           Bob says hi also!
125         1           Bob says hi again!

当您查询这些表时,您可以在 SELECT 语句中将它们连接在一起:

SELECT student_id, student_name, comment_id, comment_body
FROM student, comment
WHERE student.student_id = comment.student_id


student_id  student_name  comment_id  comment_body
2           Jane          123         Jane says hi!
1           Bob           124         Bob says hi also!
1           Bob           125         Bob says hi again!

您返回的行是两个表的组合,只要两个表中的主键(在本例中为 student_id)相等,就将两者连接(或联接)在一起。

【讨论】:

  • 这真的很有帮助!我现在开始看到光明了,哈哈。那么你已经将 student_name 设置为主键了吗?您是否还将comment_body 设置为主键?如果您能够匹配每个表中的 student_id 列,您为什么需要这样做?谢谢您的帮助!真的很感激:)
  • 我想我当时理解错了!所以这里的红色值是主键?并且通过具有相同的主键,选择可以从两个表中的每个匹配行中获取数据。与蓝色文字有什么关系吗?
  • 忽略红色和蓝色。 :) “student_id”是学生表的主键。评论表的“student_id”被认为是一个外键,而“comment_id”是该表的主键(虽然这里不用于加入)。每个连接总是涉及将一个表的外键连接到另一个表的匹配主键(名称不需要匹配,但有助于理解)。
猜你喜欢
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多