CREATE TABLE items (
itemid int not null AUTO_INCREMENT PRIMARY KEY,
itemname varchar(40) not null,
onhand int not null, # current inv based on sales and inv adjustments
price decimal (10,2) not null # default price per item
) engine=innodb;
CREATE TABLE sale (
saleid int not null AUTO_INCREMENT PRIMARY KEY, # basically an invoice #
customerid int not null, # joined to a customer table
saledate timestamp not null
) engine=innodb;
CREATE TABLE sale_detail (
saleid int not null, # invoice #
lineid int not null, # lines 1 and up for this invoice
itemid int not null, # item sold
qty int not null, # quantity sold
price decimal (10,2) not null # price per item can be overriden from items table value
) engine=innodb;
CREATE TABLE inventory_adj (
adjid int not null AUTO_INCREMENT PRIMARY KEY,
itemid int not null,
trans_typ int not null, # 0=purchase stock, 1=inventory adj, 2=shrinkage, 3=return, etc
adjdate timestamp not null, # now()
qty int not null # amt of change, positive is acquisition, negative is depletion
) engine=innodb;
手元の金額でアイテムテーブルを準備します。これが在庫レベルです。売上高から下がり、inventory_adj テーブルへの購入とともに上昇し、在庫を取得するとそこでも調整されます。これは正規化されたデータ モデルです。確かに、アイテムの手持は技術的に保持する必要はありません。オンザフライで計算できますが、少し時間がかかります。トランザクションを作成し、販売などに基づいて手持ちを更新し、トランザクションをコミットする限り、安全です。さらに、これにより、そこにたどり着くまでに何が起こったのかをより適切に監査できます。もちろん、売上高と在庫調整のエントリを作成するユーザーの名前など、他の列を追加します。