Database 如何查看实体和列之间的差异

Database 如何查看实体和列之间的差异,database,Database,有时,当我开始绘制图表时,我很难看到实体和列之间的差异。我不知道它什么时候应该是实体还是列。例如,在某些游戏中,如果您有一个用户,该用户可以自己玩,也可以在组中玩。您是否将这两个不同的实体User和GroupUser 此外,例如,如果用户拥有级别、状态和徽章,他们将获得这些级别、状态和徽章,这是游戏的一部分。这些实体是实体还是仅仅存在于作为用户一部分的一个实体中?实体可以是人(例如学生),地点(例如房间名),对象(例如书籍),抽象概念(例如课程、顺序)可以在数据库中表示,并且通常可以成为数据库中

有时,当我开始绘制图表时,我很难看到实体和列之间的差异。我不知道它什么时候应该是实体还是列。例如,在某些游戏中,如果您有一个用户,该用户可以自己玩,也可以在组中玩。您是否将这两个不同的实体
User
GroupUser


此外,例如,如果
用户
拥有级别、状态和徽章,他们将获得这些级别、状态和徽章,这是游戏的一部分。这些实体是实体还是仅仅存在于作为用户一部分的一个实体中?

实体
可以是
(例如学生),
地点
(例如房间名),
对象
(例如书籍),
抽象概念
(例如课程、顺序)可以在数据库中表示,并且通常可以成为
数据库中的

另一方面是您的
实体的属性

因此,在您的例子中,您有一个用户实体,可能的列或属性(或字段)是
UserID
UserLevel
UserStatus
徽章
播放状态
(值可以是单个或组)

您的
徽章
虽然是一列,但如果它违反了

例如,如果用户有此表:

 Table: Users

 UserID    UserName    UserStatus   PlayStatus   Badges
 ------    --------    ----------   ----------   ------
  1        Surefire    Active       Single       Private, Warrior, Platoon Leader
  2        FastMachine Active       Group        Private, Warrior
  3        BeatTheGeek Inactive     Group        Private
此处的徽章违反了
Normalization
规则中的
1NF(第一范式)
,该规则规定不应存在重复组,或者在这种情况下不应存在多值列。因此,这可以标准化为:

 Table: Users

 UserID    UserName    UserStatus   PlayStatus   
 ------    --------    ----------   ---------- 
  1        Surefire    Active       Single       
  2        FastMachine Active       Group        
  3        BeatTheGeek Inactive     Group        

 Table: Badges

 BadgeID   BadgeName   
 ------    --------  
  1        Private            
  2        Indie
  3        Warrior
  4        Platoon Leader
  5        Colonel
  6        1 Star General
  7        2 Star General
  8        3 Star General
  9        4 Star General
  10       5 Star General
  11       Hero

 Table: UserBadgesHistory

 UserID    BadgeID    ReceiveDate
 ------    --------   -----------
  1         1         12/01/2013
  1         3         12/05/2013
  1         4         1/5/2014
  2         1         2/5/2014
  2         3         2/10/2014
  3         2         11/10/2013

通常,一个实体有自己的多个列(即属性),而一个列(或属性)没有

在您的示例中,如果您感兴趣存储的唯一数据是用户的当前级别,则级别不太可能是实体。这是因为它只有一个name/number属性。如果要查找当前处于级别4的所有用户,只需使用
level=4
进行查询即可

另一方面,如果您有理由添加有关该级别的其他数据,例如与该级别相关的能力或给定用户达到该级别的日期,那么您可能希望将该级别设置为单独的实体

级别实体将具有ID、数字或名称,以及作为数据所需的任何其他属性

 ID | Prerequisite |   Ability
----+--------------+--------------
 1  | NULL         | May gain foos
 2  | Gain 10 foos | May gain bars
 3  | Gain 20 bars | 30 free foos
在完全规范化状态下,您将拥有另一个名为UserLevel的实体,您将在其中存储有关某个用户何时获得某个级别的数据

UserLevel实体将包含LevelID和UserID作为外键(链接回其他实体),以及用户何时达到该级别的DateAcreated列

 LevelID | UserID | DateAchieved
---------+--------+-------------
 1       | 1      | 2014-02-01
 1       | 2      | 2014-02-01
 2       | 1      | 2014-02-05
 3       | 1      | 2014-02-09
 2       | 2      | 2014-02-11
 4       | 1      | 2014-02-13

这显示了用户1和用户2在同一天从级别1开始,并以不同的速率升级。

正是我想要的答案。在大多数情况下,您将有超过1个级别,并有额外的数据来跟踪任务。比如布尔任务1,任务2任务3等。是的,这将是一个实体。因此,如果你刚开始做概念设计的图表。你仍然会有一个单独的实体的徽章?…你使徽章单独的实体,因为有多个类型的徽章?是的,在概念设计图中,徽章是一个单独的实体,因为基数是一对多,也就是说,一个用户可以有一个或多个徽章(如果是强制性的)或零个或多个徽章(如果是可选的)。你让我度过了一个夜晚……我终于明白我的要求了!。。。很高兴你在这里提到重复组..谢谢你很高兴能为@Ris提供帮助。祝您编码愉快,晚安,愿上帝保佑您学习数据库设计;-)