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提供帮助。祝您编码愉快,晚安,愿上帝保佑您学习数据库设计;-)