Database 这样的数据库规范化了吗?
考虑这样一个数据库 显影剂表Database 这样的数据库规范化了吗?,database,Database,考虑这样一个数据库 显影剂表 +--------------+------+---------+ | developer_id | name | revenue | +--------------+------+---------+ | 1 | John | 154,01 | +--------------+------+---------+ 应用表 +--------------+------------------+-------+-------------+ |
+--------------+------+---------+
| developer_id | name | revenue |
+--------------+------+---------+
| 1 | John | 154,01 |
+--------------+------+---------+
应用表
+--------------+------------------+-------+-------------+
| developer_id | application_name | price | sold_copies |
+--------------+------------------+-------+-------------+
| 1 | photo_app_1 | 0,79 | 123 |
+--------------+------------------+-------+-------------+
| 2 | photo_app_2 | 1,99 | 34 |
+--------------+------------------+-------+-------------+
因此,数据库:
一个开发人员与多个应用程序有关系
开发者的收入来源于所有应用程序的总售价*已售出拷贝数
这个数据库正常化了吗?如果没有,它违反了哪种范式?在我看来,它违反了第二种范式: 如果你更新了售出的拷贝数,那么你必须更新所有相关开发者的收入。现在想象一下你在哪里更新价格 让我们保持开发者表的原样 减少应用程序 为应用程序开发人员创建参考表
application_id | developer_id
-----------------+---------------
1 | 1
1 | 2
这就是为什么可以有多个开发人员参与开发同一个应用程序。
现在是价格:通常情况下,你会为每一份售出的副本持有一张收据,这对会计来说很有趣,但当价格发生变化时,你也需要一张表格来记录申请价格本身
application_id | price | date
-----------------+--------+-----------
1 | 0.79 | 2020-05-12
1 | 0.55 | 2020-05-13
收款表:
id | date | application | copies
----+------------+-------------+-------
1 | 2020-05-12 | 1 | 1
2 | 2020-05-13 | 1 | 1
使用这些表,您可以计算应用程序1的总收入:查找应用程序1的所有销售额,检查特定日期每个售出副本的价格,并计算该应用程序的每个开发人员的收入
最后,您可以计算开发人员使用其所有应用程序总共赚了多少钱
第二个NF:
如果一个关系在1NF中,且每个非键属性在功能上完全依赖于主键,则该关系为第二范式。
也就是说,数据库中的任何函数值都应该有自己的id和表
这就是为什么我们为每个应用程序在特定日期的价格创建一个表,为任何应用程序的每次销售创建一个表,为参与应用程序开发的每个开发人员创建一个表
对不起,如果我不能更好地解释的话。我了解NFs的确切规范已经有相当长的一段时间了 我认为它违反了第二条NF: 如果你更新了售出的拷贝数,那么你必须更新所有相关开发者的收入。现在想象一下你在哪里更新价格 让我们保持开发者表的原样 减少应用程序 为应用程序开发人员创建参考表
application_id | developer_id
-----------------+---------------
1 | 1
1 | 2
这就是为什么可以有多个开发人员参与开发同一个应用程序。
现在是价格:通常情况下,你会为每一份售出的副本持有一张收据,这对会计来说很有趣,但当价格发生变化时,你也需要一张表格来记录申请价格本身
application_id | price | date
-----------------+--------+-----------
1 | 0.79 | 2020-05-12
1 | 0.55 | 2020-05-13
收款表:
id | date | application | copies
----+------------+-------------+-------
1 | 2020-05-12 | 1 | 1
2 | 2020-05-13 | 1 | 1
使用这些表,您可以计算应用程序1的总收入:查找应用程序1的所有销售额,检查特定日期每个售出副本的价格,并计算该应用程序的每个开发人员的收入
最后,您可以计算开发人员使用其所有应用程序总共赚了多少钱
第二个NF:
如果一个关系在1NF中,且每个非键属性在功能上完全依赖于主键,则该关系为第二范式。
也就是说,数据库中的任何函数值都应该有自己的id和表
这就是为什么我们为每个应用程序在特定日期的价格创建一个表,为任何应用程序的每次销售创建一个表,为参与应用程序开发的每个开发人员创建一个表
对不起,如果我不能更好地解释的话。我了解NFs的确切规范已经有相当长的一段时间了 顺便说一句:实际收入不应该存储在任何表中,因为它必须随时更新,而且它实际上只取决于售出的拷贝数和价格。最好为此创建一个视图。我同意,但在某些情况下,执行该视图的成本可能非常高。。。特别是如果开发者的总收入需要显示在数百个选择上,而且很少改变。e、 g.用户在投票网站上的分数。在这些情况下,我有时会在units表类型发生变化时使用触发器重新计算用户的总和。通常,我会将总和放入一个跟踪表中,以便与运行整个视图的每晚cron作业进行核对。这一点很好!您的触发器可以更新当月的收入,因为它可能会经常更改,而上个月的收入通常不会更改,在这种情况下,最好将其放在专用表中。在任何情况下,应平衡读/写次数,并根据需要调整数据库设计。这就是NFs不能总是一对一应用的地方。顺便说一下:实际收入不应该存储在任何表中,因为它必须随时更新,而且它实际上只取决于售出的拷贝数和价格。最好为此创建一个视图。我同意,但在某些情况下,执行该视图的成本可能非常高。。。特别是如果开发商的总收入需要显示在数百个屏幕上
选择,很少更改。e、 g.用户在投票网站上的分数。在这些情况下,我有时会在units表类型发生变化时使用触发器重新计算用户的总和。通常,我会将总和放入一个跟踪表中,以便与运行整个视图的每晚cron作业进行核对。这一点很好!您的触发器可以更新当月的收入,因为它可能会经常更改,而上个月的收入通常不会更改,在这种情况下,最好将其放在专用表中。在任何情况下,应平衡读/写次数,并根据需要调整数据库设计。这就是NFs不能总是一对一应用的地方。收入是一个动态实体,所以应该在运行时计算。收入是一个动态实体,所以应该在运行时计算。