在我的网站上,我正在创建发票功能。 发票包含静态信息:公司信息和接收方信息。 但它也有动态信息:小时数,描述,总金额等。 客户可以使用上面的动态信息添加多行。
现在我的问题是, 我如何将其实现到我的数据库中?
目前我有一张名为“invoice”的表格,其中的列将包含上述所有信息。 但是这样,行会有不必要的信息,比如公司和收件人信息,实际上每张发票只需插入一次。
你们怎么认为我必须解决这个问题?
我想避免使用2个表,但如果没有其他选项,那么我会。
问候
答案 0 :(得分:1)
如果需要完全关系型数据库,则需要创建第二个表。这将保留客户信息。然后,此密钥将成为“发票”表中的外键,因此您只需存储一次客户信息。这将是实现这样的事情的推荐方式。
另一种方式(我不建议这样做)是您需要创建一个对“父”发票(存储客户信息的发票)的循环引用。然后,每次创建新发票时都必须插入该父记录ID,这样您就可以检索存储的信息。对于同一客户的所有其他发票,您只需将该信息留空即可。
答案 1 :(得分:0)
为每个基表选择一个语句
你想要一张桌子的愿望是不知情的,也是不明智的。
每个表都有关于应用程序情况的基本声明。使该语句为true的行将在表中。
ivoice(i,c,...) // invoice [i] is to company [c] with ...
company(c,n,a,...) // company [c] has name [n] and address [a] ...
receiver(r,...) // receiver [r] ...
因此,每个当前行都会生成一个真实的语句(或者它将不存在),并且每个缺少的行都会生成一个错误的语句(或者它将存在)。因此,您可以将表视为从当前行中生成语句,以及从缺少的行中生成语句的NOT。基表一起描述了您的应用程序情况。
在基表声明中限制'AND'
基本思路是从语句中删除大部分AND。如果table语句是较小语句的AND,则它们应始终如下:
(1) something AND-free about [k1],...
其中列k1,...上的每个子行在表中都是唯一的,并且没有包含较小的子行,或者像:
(2) [c]=some_function_of_all_of(k1,...)
(这被称为“第五范式”。)
为什么要限制'AND'?
因为否则你的表会有一个有问题的陈述,其中一个更简单,例如:
blah [k1] blah [k2] AND blub [j1]
当“blah ZZ blah 88”为真或假时,根据“blub [j1]”的真相,你通常不得不在本表中放入一行而不是一堆行。每个可能的j1值。 (这称为更新异常。)
此外,很可能你想说“blah VV blah 999”是真是假(在桌子内外)没有关于j1s的喋喋不休。但是你选择的桌子不会让你。 (这被称为错误的设计。)
PS:每个查询都有一条声明
每个查询表达式都有一个语句。查询的值是使其语句为true的行。通过关系运算符组合表来进行查询,通过逻辑运算符组合语句来生成语句。表的JOIN,ON和WHERE表示语句的AND,表的UNION表示语句的OR,SELECT表示有,等等。所以当你查询时,你正在从基表语句中构建更复杂的语句。
// there is a name n,... where:
// invoice [i] is to company [c] and ...
// AND company [c] has name [n] and address [a] ...
SELECT i,c,a FROM company JOIN invoice ON company.c=invoice.c