インベントリ用に小さなデータベースを作成したいのですが、構造の選択に問題があります。在庫は一日の終わりに毎日更新されます。
私が直面している問題は次のとおりです。
私の製品のテーブルがあります。
id, name, price, quantity.
今、私は私の販売のための別のテーブルを持っていますが、私の問題があります。どのようなフィールドが必要ですか。結局のところ、次のようなレコードを保存したいと思います。
20 product_x $ 5,00 $ 100,-
20 product_y $ 5,00 $ 100,-
20 product_z $ 5,00 $ 100,-
20 product_a $ 5,00 $ 100,-
-------------------------------------------------
$ 400,-
それで、これを販売記録でどのようにモデル化しますか?製品IDのコンマで区切られた連結レコードを作成するだけですか。
または、これを正しい方法でモデル化する別の方法があります。
1日1アイテムあたり1行のテーブルがあります。日付、アイテムID、販売数量、および販売価格を保存します(これは製品テーブルにも含まれていますが、これを保存します-変更された場合、保存時に実際に販売した値)。クエリでは、1日あたりの合計と1日あたりの合計を計算できます。
テーブル:
create table product (
id integer primary key,
name varchar(100) not null,
price decimal(6,2) not null,
inventory integer not null
);
create table sale (
saledate date not null,
product_id integer not null references product,
quantity integer not null,
price decimal(6,2) not null,
primary key (saledate, product_id)
);
当日の報告:
select s.product_id, p.name, s.quantity, s.price, (s.quantity * s.price) as total
from product p, sale s
where p.id = s.product_id
and s.saledate = date '2010-12-5';
すべての日に関するレポート:
select saledate, sum(quantity * price) as total
from sale
group by saledate
order by saledate;
要約行を含む、すべての日にわたる素晴らしいマスターレポート:
select *
from (
(select s.saledate, s.product_id, p.name, s.quantity, s.price, (s.quantity * s.price) as total
from product p, sale s
where p.id = s.product_id)
union
(select saledate, NULL, 'TOTAL', sum(quantity), NULL, sum(quantity * price) as total
from sale group by saledate)
) as summedsales
order by saledate, product_id;
これは多くの側面をサポートするモデルであり、
これがお役に立てば幸いです。各テーブルについてさらに情報が必要な場合はお知らせください。
乾杯...!!!
Wajira Weerasinghe。
インベントリはモデル化がかなり複雑になる可能性があります。まず、支払った金額に基づいて、手持ちの在庫の値を伝える必要があることを理解する必要があります。つまり、現在の価格に更新された製品テーブルを信頼することはできません。このようなテーブルを使用して何を売るかを理解するのに役立つ場合がありますが、倉庫内の各アイテムに対して支払った実際の価格を知る必要があるのには、税務上の理由があります。
したがって、最初に製品テーブルが必要になります(この中に日付列が更新されていることを確認したい場合があります。価格が古くなっているように見える場合に便利です)。
次に、各部品の実際の倉庫の場所と購入時の価格を格納するテーブルが必要です。アイテムが十分に大きい場合、各アイテムを個別にマークして、何が取り出されたかを知る方法が必要です。通常、人々はそのためにバーコードを使用します。このテーブルを更新して、販売時に部品がなくなったことを記録する必要があります。私はレコードを非アクティブにして、そのレコードへの販売データへのリンクを設定することを好むので、私が支払った金額と各部品を販売した対象を正確に把握しています。
販売には少なくとも2つのテーブルが必要です。 1つは販売に関する一般的な情報、顧客名(このデータを取得するためにほとんどの場合、顧客テーブルも必要です)、日付、出荷先などです。
次に、注文の各ラインアイテムのレコードを含む販売詳細テーブル。パーツ、色、サイズ、数量、価格について必要なすべてのデータを含めます。これは非正規化ではなく、履歴データを格納しています。あなたがやりたくないのは、この表への最初のエントリ以外のすべてについて、製品表の価格に依存することです。前日に製品の価格が変更されたため、販売レポートを作成したくないが、数値が間違っている場合。
会計士や税の専門家に相談せずに在庫データベースを設計しないでください。また、内部統制についてもいくつか読む必要があります。データベース内の内部統制に関する作業を行っていない、発見されていない会社から盗むのは簡単です。
販売をトランザクションとしてモデル化してみてください-「ヘッダー」、つまり販売先、販売時に請求書番号(該当する場合)などと「ラインアイテム」、つまり20 * product_x @ $ 5 = $ 100を使用します。最も安全な方法は、商品テーブルの価格などに依存しないようにすることです。これらはおそらく時間とともに変化し、代わりに製品情報の大部分(すべてではないにせよ)をラインアイテムにコピーするため、価格やアイテムの説明などでも変更すると、トランザクション情報はトランザクションが行われた時点の状態のままになります。
顧客ごとのトランザクションプロパティを示すフィールドが含まれたテーブルが必要だと思いますORフィールドが含まれたテーブル-日付、製品(外国)、数量-このようにして、新製品で問題はありません
リンク付きの複数のテーブルを試す
table_products
id
name
table_product_sales
id
product_id
quantity
price_per
transaction_time AS DATETIME
SELECT table_product_sales.*, table_product.name
FROM table_product
JOIN table_product_sales
ON table_product_sales.product_id = table_product.id
GROUP BY DATE(transaction_time)
試したことはありませんが、そのようなものはうまくいきますか?これにより、各トランザクションを個別に保持できるため、販売ごとの平均販売数、日付ごとの合計販売数、毎日の合計販売などを照会できます。