Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 这样的数据库规范化了吗?_Database - Fatal编程技术网

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不能总是一对一应用的地方。收入是一个动态实体,所以应该在运行时计算。收入是一个动态实体,所以应该在运行时计算。