【发布时间】:2021-10-27 11:33:18
【问题描述】:
我正在为热网络建模一个标准化数据库(它应该在 3NF 中)。在这张表中,结构是这样的(我删除了不重要的数据):
-
Heat_units(ID(PK),姓名) -
Clients(id (PK), client_name, heat_unit_id (FK)) -
Heat_unit_consumption_history(id (PK), date, heat_unit_id (FK), used_energy) - 其中 (date, heat_unit_id) - 表示复合键 -
Invoices(id (PK), start_date, end_date, client_id (FK)) -
Invoice_details(invoice_id (PK, FK), heat_unit_consumption_history_id (PK, FK), price_id (FK)) - invoice_id 和 heat_unit_consumption_history_id 是复合主键 -
Prices_history(id(PK), start_date, price) - start_date 是唯一键
在这里我只能看到可以添加错误数据的一种方式...如果在 invoice_details 我们链接到另一个热量单位的消耗历史。除了对这个约束进行编程之外,我还没有找到一种方法来确保在 invoice_details 中我只有当前客户的 heat_unit 的消费历史 ID。
有没有办法可以在数据库中添加这个约束?或者如果我将它添加到规范中并以编程方式实现它可以吗?
编辑: 这是添加代理键之前的数据库
热量单位(ID(PK),名称);
客户端(client_code (PK)、client_name、heat_unit_id (FK));
Heat_unit_consumption_history (date (PK), heat_unit_id (PK, FK), used_energy) - 其中(date, heat_unit_id) - 表示复合主键;
发票(invoice_number (PK)、start_date、end_date、client_code (FK));
Invoice_details(invoice_number (PK, FK), heat_unit_consumption_date (PK, FK), heat_unit_id (FK), price_history_start_date (FK)) - invoice_number 和 heat_unit_consumption_date 是复合主键;
Prices_history(开始日期(PK),价格)
【问题讨论】:
-
在 Price_histories 中 start_date 是单个属性。怎么可能是复合键?
-
这个设计说每个Client只有一个Heat_unit,每个Heat_unit可以有多个Client。这是正确的吗?
-
伦佐,我的错,我想说唯一键
-
RBarryYoung,没错,是的。要求规定,如果客户端更改地址,则应创建一个新客户端,但热量单元可以与另一个客户端关联
标签: database-design database-normalization