Mysql 创建SQL发票表的最佳方法

Mysql 创建SQL发票表的最佳方法,mysql,sql,database,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_tot

我有这些桌子:

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

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

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

GASM_客户机
GASM_发票
表之间应该存在主键-外键关系。您可以在各自的DBMS中创建
GASM_INVOICES
表时指定此关系。指定此关系将确保列
GASM\u INVOICES.id\u client
包含对
GASM\u CLIENTS
表中有效行的引用

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

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

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

实际插入到查询中的
太多,无法在此答案中写入。只要进行我在这里提到的更改,阅读一些优秀的书籍,如Korth的和其他关于数据库设计的书籍,你就会得到这个想法


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

我也是,但是如果我希望用户可以直接写下客户端的名称,而无需注册客户端?我在哪里存储客户的名称?我需要在发票表中添加另一个字段,是否为空?我不喜欢这种想法​​有很多次现场名称客户真诚地告诉我,您的回复对我帮助很大,现在我更了解如何解决这个令人困惑的疑问。