设计数据库,需要知道我做的是否正确

Designing a database, need to know if I'm doing it correctly

我有一个正在为朋友的公司建立的网站,我想知道如何存储数据。到目前为止,我已经设计了这张图。让我举个例子:

假设空手道锦标赛中有 2 个项目:散打和形式。每个项目都可以有自己的分组:4-6 岁的陪练,8-10 岁的陪练,等等......每个学生可以报名参加 1 个或所有项目。

我的问题是,下图是否足以说明我刚刚在示例中解释的内容(减去基数)。

我的第二个问题是,实际的数据库是什么样的?现在,我可以想到添加以下表格:

谢谢,任何帮助我成为更好的设计师的建议都会有所帮助。

保持简单,让它变得有趣。

  • 去掉 "id" 术语(改为 student_id 或 division_id 或 event_id)使用能够真正清楚地表明所标识的术语。 "name" 相同.. 是 student_name 还是 event_name?
  • 尽可能详细地介绍每个学生 (student_id, current_belt_ranking, date_of_birth (--> age), student_name.
  • Events (event_name, division_id, date, location)(我会做 key = event_name/division 对)或者替代 "Sparing_8-10", "Forms_4-6"
  • 部门(部门 id,指示的其他内容)
  • student/events table(student_id 与 event_name/division_id 对匹配)

分析第一、第二、第三范式。

  • 第一范式(1NF):用简单的英语来说,任何数据行都不能有重复元素。记录类型的所有出现必须包含相同数量的字段。例如(您不会将给定学生报名参加的活动放在学生 table 中。将这些东西放在单独的 table 中。)

  • 第二范式(2NF):说白了,单行中是否有任何数据元素只依赖于级联主键的一部分?如果是这样,请将这些元素移除到附加的 table 中。 (例如:您不会在 student/events table... 中包含学生姓名、年龄和 date_of_birth )

  • 第三范式 (3NF):table 的每个非主属性都非传递地依赖于 table 的每个超键。当一个非关键字段是关于另一个非关键字段的事实时,3NF 被违反。(是的,这甚至有意义吗?坦率地说,我不能用你的例子为你提供这样的例子......让我做一些研究...使用您的系统,我认为没有任何 table 具有大量字段甚至接近此违规行为。请记住 3NF 处理与其他相关的非关键字段非关键字段。)

试一试,然后构建您的查询,看看它们是否有意义?