创建发票表SQL的最佳方法

时间:2012-11-25 00:46:48

标签: mysql sql database

我有这些表格:

* gasm_clients
id_client INT NOT NULL,
name_client VARCHAR(50) NOT NULL,
cellphone_client VARCHAR(15) NOT NULL

* gasm_invoices
id_invoice INT NOT NULL,
(id_client || client_name) --> I'm not sure of these two columns which use
invoice_total DECIMAL(10,2) NOT NULL
....

必须澄清客户必须先以另一种形式注册,但要快速开具发票,我只需要客户名称,而无需在客户表中注册。

我想允许用户搜索所有已注册的客户端或单个写入客户端名称。

EX: 
1. Choose Client
2. Write name

但我不知道在SQL上执行此操作的最佳方式是什么。

2 个答案:

答案 0 :(得分:1)

您希望在构建数据库时最大限度地减少数据重复。第一个选项(id_client)将是我使用的。

答案 1 :(得分:1)

为了最大限度地减少重复并保持数据完整性,hd1的方法是正确的。

应该有一个主键 - GASM_CLIENTSGASM_INVOICES表之间的外键关系。您可以在各自的DBMS中创建GASM_INVOICES表时指定此关系。指定此关系将确保列GASM_INVOICES.id_client包含对GASM_CLIENTS表中有效行的引用。

接下来,您不必每次都注册您的客户。这很容易解决。将id_client自动生成的整数主键name_client保留为not null,并删除not null列上的cellphone_client约束。此列不需要此约束。它只会增加数据开销和混乱。

此外,除非绝对需要,否则使用除主键(ID)之外的列引用另一个表是一个坏主意。

现在,使用此模式,您可以设计一个前端逻辑,当操作员输入客户端名称时,软件可以在gasm_clients表中搜索它,并向操作员显示搜索结果以供选择。否则,运营商可以选择将新名称添加到将添加到数据库中的新客户端。

在这个答案中,实际的INSERT INTO查询太多了。只需进行我在此处提到的更改,阅读一些优秀的书籍,如Korth和其他数据库设计,您就会明白这一点。

我希望我的回答足够有用。