0

我有这些表:

* 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 上执行此操作的最佳方法是什么。

4

2 回答 2

1

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

于 2012-11-25T00:55:33.113 回答
1

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

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

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

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

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

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

我希望我的回答足够有帮助。

于 2012-11-25T02:17:57.157 回答