我们假设网站上有两个不同的实体。
教师和学生。
他们都登录网站。现在我有以下表格
**Users**
- id
- email
- password
**Students**
- GPA
- SAT
- ACT
- user_id references Users ID
**Teachers**
- user_id references Users ID
- classroom_no
- salary
- average_class_size
因此,当学生注册时,我在“用户”和“教师”表中都添加了一行。
当教师注册时,我在“用户”和“教师”表中都添加了一行。
让一个表具有以下字段的用户更好吗?
**Users:**
- id
- ACT
- GPA
- SAT
- average_class_size
- salary
- classroom_no
- role (0 = teacher 1 = student)
即使有些行会引用教师(因此也不会使用ACT,SAT,GPA字段)
...
谢谢!
答案 0 :(得分:3)
如果您不熟悉数据库规范化,请阅读this。
除非性能是一个严重的问题,否则我不会考虑为此结构使用单个表。随着您的项目进行,您很可能会为每个角色添加更多字段,并且可能还会添加更多角色。维持这一点将变得越来越困难。
我实际上会更进一步,在您的应用程序中引入另一个名为role
的概念,以及相应的数据模型来保持它。
你的桌子应该是:
users:
- id
- email
- password
roles:
- id
- type
user_roles:
- user_id
- role_id
role_teacher:
- user_id
- classroom_no
- salary
- average_class_size
role_student:
- user_id
- GPA
- SAT
- ACT
拥有单独的角色表可以让您将身份验证表(用户)与其他数据分开。如果用户既可以是教师又可以是学生,这可能会变得很重要。
这应该让您基本了解如何构建数据库。
您可能会发现您将开始为系统中的类等其他概念建模。因此,添加适当的表可能类似于:
role_teacher:
- user_id
- salary
classroom:
- id
- capacity
class:
- id
- name
- teacher_id
- classroom_id
- start_date
- end_date
class_enrollment:
- class_id
- student_id
- enrollment_date
- grade
教师课堂等项目现在转移到课堂上,允许教师教授多个课程(也许你需要重新添加"家庭室"的概念)。教师的平均班级大小只是一个计算(尽管为了提高效率,你可能还想存储它)。
希望这有助于指导您朝着正确的方向前进!
答案 1 :(得分:1)
您应该使用Teachers
和Students
表格。数据库中的表应该反映真实世界模型(当然可能的话)。将所有内容合并到单个User
表中几乎没有什么价值,并引入了以下问题:
最重要的是,我将Users
表重命名为UserLogins
- 它更明确地表明其目的。
答案 2 :(得分:0)
我的感觉是你拥有它的方式更好 - 你必须维护两个表以便它们保持同步,但你最好将“用户”,“学生”和“老师”的角色封装起来这条路。它还为您提供了更好的维护工作 - 如果您希望允许“父级”使用对其子级的引用登录,该怎么办?那么“校长”怎么样?这些都是用户,但很快就会破坏统一的表格。
答案 3 :(得分:0)
有几种方法可以做到这一点,但我认为一个用户表是正确的方法。你可以拥有空列 - 它看起来不是最好的,但是如果它适合你,它将允许最少的编码来获得你需要的值。
另一个选项可能是拥有一个属性表{UserId,Attribute,Value},然后你可以拥有:User1 GMAT 710,User1 ACT 30等等。这样你就可以获得一个属性列表用户通过select * from UserId = user.UserId或其他类似的属性。更多的代码开销,更清洁。这也允许您在将来为了任何目的添加更多属性,并保持数据库相同。
答案 4 :(得分:0)
如果一位教师可以参加多个班级,那么您的设计就会失败,因为教师表会有多个参赛作品。
相反,创建一个教师表,我们可以存储教师表,创建一个中间表,我们可以存储教师和他的课程。
同样,教师和用户表应该是分开的.. 我们可以存储单独的用户表,我们可以存储使用详细信息..