2017-05-10 8 views
0

私は、データベースにアイテムの数量を格納する最も簡単な方法を考えようとしています。私は、人々にレンタルされたギアを監視しログに記録するために開発しているWebアプリケーションと連携して動作するデータベースを作成しています。だから、私はすでにいくつかの異なる方法を考えてきましたが、将来に備えて維持することが容易かどうかはわかりません。どのようにアイテムの数量をSQLデータベースに保存しますか? (Postgresql)

私は毎回ギアを取り出したためその後などのサイズなどのデータとともにギアの種類(例えば、シャツ、ズボン、帽子)を格納gear表は、それが記録されている

1アイデアgear_inventoryテーブルには、ユーザーID、歯車タイプ、ブール値などの詳細情報が格納されています。そして、数量を追跡するために、gearテーブル内の特定の歯車アイテムの歯車数をtotal_quantiyと数えます。これは、アイテムが取り出されたときまたは指定された数量に戻されたときにトリガされる第2のクエリで更新されます。 2

アイデアは、そのタイプのすべての非返されるアイテムの数としてgear_inventoryに連結された前述の総量を持っ。

アイデア3

テーブル更新または挿入時にこれらの量を変更するには、更新タスクを持っています。次に、与えられたクエリの量を加算または減算することによって同じことを行います。

アイデア1は、他のアイデアよりも最も簡単で信頼できるものではありません。アイデア2は最も信頼性が高く、量の取り扱いが確実にデータベースに入ります。その後、アイデア3はまだそれを更新する予定のタスクに依存しているので信頼性が高くありません。

これで、記録された在庫レコードとの同期が失われないように、量量をどのように実装しますか?

編集1

詳細情報 - 私は保存するか、その項目との合計nunberの仲間と比較することができ、取り出したアイテムの数を持っていることの方法を持っているachiveしようとしているコア・ソリューション。下で勇気づけられるように、それはボーリング場の貸し出し/借りる靴と同様のファッションで動作し、exectユーザーは記録されます。したがって、アイテムが貸し出されたときにレコードが挿入され、そのレコードはリターン日付に更新されます。アイテムのタイプは、一般的なアイテムの詳細を格納する独自のテーブルにあり、記録されたギアテーブルと1対多の関係になります。問題は、アイテムの数を格納/検索する完全な証明/信頼性の高い方法です。または、私はこれを熟考しています。簡単なカウントクエリは十分ではありません。

+0

あなたが解決しようとしている問題についてもっと話をし、あなたの提案された解決策について話をすることができない場合、これは簡単に答えることができます。いくつかのストレートフォワード・ジョイン・テーブルで処理されるようですが、問題のパラメータを把握するのは難しいです。シナリオは何ですか?あなたはそのデータで何をしたいですか?これは装備を貸し出しているボーリング場のようなものですか? – Schwern

+0

@Schwernあなたが探していた情報を、うまく追加しました。 – sparcut

+0

大きなデータを扱う可能性は低く、統計テーブルは必要ないため、アイデア2が最適だと思います。あなたは 'gear_inventory_returned'と呼ばれる追加のテーブルを作成し、' gear_inventory'からそのテーブルにレコードを移動することができます。 –

答えて

1

私たちが追跡していることを考えてみましょう。

  • アイテムの種類についての情報。
  • 現在の在庫。
    • 何人ですか?
  • 貸し出されたもの。
    • 誰に?
    • 何人ですか?
  • 返されたもの
    • 誰によってですか?
    • 何人ですか?

最初のカットは、このようになります:あなたが何かを貸すとき

create table items (
    id serial, 
    name text, 
    ... 
); 

create table inventory (
    id serial, 
    item integer references items(id), 
    quantity integer check(quantity >= 0) 
); 

create table loans (
    id serial, 
    user integer references users(id), 
    item integer references items(id), 
    quantity integer check(quantity >= 0), 
    when_loaned timestamp not null default now(), 
    when_returned timestamp 
); 

は、融資に行を挿入します。その返却時にloans.when_returnedを設定します。 loans.when_returnedがnullの場合、それはまだ残っています。

貸出中は在庫を減らし、返却時には貸し出しを増やすことができます。データの整合性を保つために、これはトリガーとしてではなく、をスケジュールされたプロセスとして実行する必要があります。

在庫量を変更しないでください。代わりに、在庫内の金額から貸出品目の数を減算します。つまり、select sum(quantity) from loans where item = ? and when_returned is nullselect quantity from inventory where item = ?です。これにより、ローンとリターンがより簡単になり、在庫数が壊れる可能性はなくなりますが、多くの未払いローンが多数存在すると、パフォーマンス上の問題が発生する可能性があります。


5つのアイテムを貸し出して3を返すとどうなりますか?どのようにそれを追跡しますか? 1つの簡単なオプションは、1つのローンを2つのローンに分割することです。

-- Copy the loan row 
insert into loans 
select * from loans where id = :orig_id 

-- Track that 3 were returned 
update loans 
set quantity = 3, returned = now() 
where id = :orig_id 

-- Two are now outstanding 
update loans 
set quantity = 2 
where id = :new_id 

あなたがこれをどのように使っているのか、ユースケースが何であるのか、そしてスケールが何であるかについては、私が言うことができるすべてです。それは良い出発点です。

関連する問題