表设计与postgresql

时间:2015-04-15 06:16:49

标签: sql postgresql database-design

我正在研究库存管理系统。在后端我们使用POSTGRESQL数据库。我们有3张桌子:

1. invoice:
   a. invoice_no CHARACTER VARYING(20), //PK stores the invoice no.
   b. invoice_date DATE, //stores the invoice date.
   c. party INT. //FK party.id the id of the party of the invoice.

2. invoice_item:
   a. invoice_no CHARACTER VARYING(20) //FK invoice.invoice_no,
   b. invoice_serial INT, //stores the invoice item serial no.
   c. item INT, //FK item.id stores the id of the item.
   d. quantity INT, //stores the quantity of the item.
   e. discount NUMERIC, //stores the discount given on the item.
   f. tax NUMERIC, //stores the amount of tax applicable.
   g. total NUMERIC. //stores the total amount including tax and reducing discount of the item.
//columns invoice_no and invoice_serial is the PK of this table.

3. inventory:
   a. inventroy_id SERIAL //PK auto generated serial.
   b. purchase_invoice_no CHARACTER VARYING(20), //FK inventroy_item.invoice_no
   c. purchase_invoice_serial INT, //FK invoice_item.invoice_serial.
   d. sales_invoice_no CHARACTER VARYING(20), //FK inventroy_item.invoice_no
   e. sales_invoice_serial INT, //FK invoice_item.invoice_serial.
   f. quanity INT. //stores the quantity of item transacted.
//If the item is in stock then the sales_invoice_no and sales_invoice_serial is null.

所有发票,销售和购买都存储在发票表中。

当销售发票数量小于采购发票数量时,在库存表中创建一个新条目,其中包含销售和采购发票项目以及销售数量,并将具有销售发票项目的条目中的数量减少为{{ 1}}按销售量计算。

实际数据存储在nullinvoiceinvoice_item 分区表中,基于年份,因此我们有说2015年 - > inventoryinvoice_2015invoice_item_2015以及父表的所有约束。 但这会产生一个新问题,因为有些商品是在2014年购买并在2015年销售的。因此,当存储这些商品发票时,由于inventory_2015具有购买发票项目,因此存在外键违规但销售发票项目显示在表格inventory_2014中,但invoice_item_2015只能引用inventory_2014表格。

您能否建议我克服这个问题的方法或任何有关设计变更的建议。感谢。

1 个答案:

答案 0 :(得分:0)

我建议你放弃分区,转而支持部分索引和年度聚类。对于异常问题而言,分区是一种奇特的解决方案,而不是普通问题的解决方案,至少在PostgreSQL中是这样。

如果你不能这样做,那么下一个最好的方法是拥有一个所有引用的窄连接表,这是一个触发器维护的。