我正在研究库存管理系统。在后端我们使用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}}按销售量计算。
实际数据存储在null
,invoice
和invoice_item
的分区表中,基于年份,因此我们有说2015年 - > inventory
,invoice_2015
和invoice_item_2015
以及父表的所有约束。 但这会产生一个新问题,因为有些商品是在2014年购买并在2015年销售的。因此,当存储这些商品发票时,由于inventory_2015
具有购买发票项目,因此存在外键违规但销售发票项目显示在表格inventory_2014
中,但invoice_item_2015
只能引用inventory_2014
表格。
您能否建议我克服这个问题的方法或任何有关设计变更的建议。感谢。
答案 0 :(得分:0)
我建议你放弃分区,转而支持部分索引和年度聚类。对于异常问题而言,分区是一种奇特的解决方案,而不是普通问题的解决方案,至少在PostgreSQL中是这样。
如果你不能这样做,那么下一个最好的方法是拥有一个所有引用的窄连接表,这是一个触发器维护的。