いろいろググって見たり、書籍を読んでみたけど、次のあたりが、初心者にはお薦め
ADempiere
今も Compiere -> ADempiere ...> iDempiere とフォークされていますが、javaによるオープンソースERP。生産管理や販売管理等、多機能で、当然、ソースも巨大な為、趣味でソースを読む気には慣れません。
http://www.adempiere.com/JP/Top_Page
http://www.adempiere.com/ADempiere_ERP
src
http://sourceforge.net/projects/adempiere/ (本家)
http://sourceforge.jp/projects/adempiere/ (日本用)
※ソースの取得方法は「ADempiere ソースコード ダウンロード」等でググって下さい
SalesCube
アーク情報システムが、開発し、ソース(java)も公開している在庫管理機能も備えた販売管理システム。先程のADempiereより画面がスッキリで、個人的にはこちらの方が好み。
http://www.ark-info-sys.co.jp/jp/product/salescube/product.html
src
ソース行数は10万行を超えているので、中々の規模。
https://ark-salescube.appspot.com/pub/
https://github.com/salescube/SalesCube
グラス片手にデータベース設計〜販売管理システム編
在庫管理に関する書籍は、たくさんありますが、db schema (DDL)が記載されているので、 ADempiere や SalesCube のソースの前に読むのがよいかと
http://www.seshop.com/product/detail/4516/
在庫管理DDLを書いてみた
「グラス片手にデータベース設計」を参考にしましたが、こんな感じかな
create table shouhin_master ( shouhin_cd varchar(10), shouhin_name varchar(20), hanbai_tanka int comment '販売単価(税抜)', shiire_tanka int comment '仕入単価(税抜)', unit varchar(5) comment '単位. {個, M, ㎡}等', shiire_saki_id varchar(10), zaiko_type varchar(10) comment '在庫管理区分 {管理対象,管理対象外}', start_date date comment '有効開始日', end_date date comment '有効最終日', PRIMARY KEY (shouhin_cd, start_date) ) comment='商品マスタ'; create table hachuu ( hachuu_cd varchar(10), shiire_saki_id varchar(10), shiire_saki varchar(20), hachuu_date date comment '(伝票上の)発注日', hachuu_price_net int comment '合計発注額(税抜)', hachuu_price_tax int comment '合計発注額(税)', tax_rate decimal(3,2) comment '消費税率 例:0.05', delivery_date date comment '指定納期(明細中で最遅)', reply_delivery_date date comment '回答納期(明細中で最遅)', delivery_to varchar(20) comment '納入先', note varchar(200) comment '備考', update_user varchar(32) comment '更新日時', update_time timestamp, hachuu_user varchar(32), hachuu_time timestamp comment '発注処理日時', shiire_user varchar(32), shiire_time timestamp comment '仕入処理日時', PRIMARY KEY (hachuu_cd) ) comment='発注'; create table hachuu_meisai ( hachuu_cd varchar(10), row_no int comment '行NO', shouhin_cd varchar(10), shouhin_name varchar(20), shiire_tanka int comment '仕入単価(税抜)', quantity int comment '数量', shiire_price int comment '仕入額(税抜)', unit varchar(5) comment '単位. {個, M, ㎡}等', delivery_date date comment '指定納期', reply_delivery_date date comment '回答納期', meisai_note varchar(100) comment '備考', PRIMARY KEY (hachuu_cd,row_no) ) comment='発注明細'; create table soko ( soko_cd varchar(10), soko_name varchar(20), address varchar(30), note varchar(30) comment '備考:自社倉庫, 客先倉庫, 仕入先倉庫', PRIMARY KEY (soko_cd) ) comment='在庫'; create table zaiko ( soko_cd varchar(10), shouhin_cd varchar(10), lot_no varchar(10), valid_zaiko int comment '有効在庫数', actual_zaiko int comment '実在庫数', note varchar(100) comment '備考', update_time timestamp, update_user varchar(32), PRIMARY KEY (soko_cd,shouhin_cd) ) comment='在庫';