1

個々の部品とキット (アセンブリ) の在庫を追跡する必要がありますが、満足のいく方法が見つかりません。偽の非常に単純化されたデータベースの例:

テーブル製品:
製品 ID 1
prodName フラックス コンデンサ
製品コスト 900
製品価格 1350 (900*1.5)
prodStock 3
-
製品 ID 2
prodName ミスター・フュージョン
製品コスト 300
製品価格 600 (300*2)
製品ストック 2
-
製品 ID 3
prodName タイムトラベル キット
生産コスト 1200 (900+300)
製品価格 1560 (1200*1.3)
製品ストック 2

テーブル関連
relID 1
relSrc 1 (フラックスコンデンサ)
relType 4 (のサブパーツです)
relDst 3 (タイムトラベルキット)
-
relID 2
relSrc 2 (フュージョン氏)
relType 4 (のサブパーツです)
relDst 3 (タイムトラベルキット)

prodPrice: コストに基づいて計算されますが、線形ではありません。この例では、コストが 500 以下で、マークアップは 200% です。500 ~ 1000 のコストの場合、マークアップは 150% です。1000+ のコストの場合、マークアップは 130% です。そのため、タイムトラベル キットは個々のパーツよりもはるかに安価です。

prodStock: これが私の問題です。私はキットまたは個々のパーツを販売できるので、キットの在庫は仮想です。

購入時の問題: Time Travel キット全体 (1 つのバーコード付き) を販売しているプロバイダーもあれば、個々のパーツ (別のバーコード付き) を販売しているプロバイダーもあります。 .

販売するときの問題: キットのみを販売する場合、在庫の計算は簡単です: 「3 つのフラックス コンデンサーと 2 つの Mr Fusions があるので、2 つのタイム トラベル キットと 1 つのフラックス コンデンサーがあります」しかし、キットまたは個々のパーツを販売できます。 . そのため、個々のパーツと可能なキットの在庫を同時に追跡する必要があります (販売価格を補償する必要があります)。

おそらくこれは本当に簡単ですが、簡単な解決策がわかりません。再開: 在庫を追跡する方法を見つける必要があり、データベース/プログラムがそれを実行する必要があります (店員に在庫の修正を依頼することはできません)。

私はphp + MySqlを使用しています。しかし、これはプログラミングの問題というよりも論理的な問題です

更新: 残念ながら、Eagle のソリューションは機能しません。

  • 関係は再帰的であり、再帰的です (あるキットは別のキットを使用します)。
  • 同じ部品を複数使用するキットがあります (フラックス コンデンサ 2 個 + Mr Fusion 1 個)。
  • キットの在庫の値を保存する必要があります。ユーザーが部品を購入したい Web ページにも同じデータベースが使用されます。そして、利用可能な在庫を表示する必要があります (そうしないと、購入しようとさえしません)。また、ユーザーが Web ページで検索するたびに株価を計算する余裕はありません。

しかし、株式を仮想としてマークするブール値のアイデアが好きでした

4

1 に答える 1

1

まずprodStock、タイム トラベル キットの は仮想であるため、データベースに保存することはできません。基本的には計算フィールドになります。prodStockが計算されているかどうかを示すブール値がテーブルにあれば、おそらく役立つでしょう。テーブルにこのフィールドがあるかのようにふりをしてisKit、今のところそれを呼び出します (ここでTRUE、それはキットであり、prodStock計算する必要があることを意味します)。

次に、在庫のある各アイテムの量を計算します。

select p.prodID, p.prodName, p.prodCost, p.prodPrice, p.prodStock from prod p where not isKit
union all
select p.prodID, p.prodName, p.prodCost, p.prodPrice, min(c.prodStock) as prodStock
from 
  prod p
  inner join rels r on (p.prodID = r.relDst and r.relType = 4)
  inner join prod c on (r.relSrc = c.prodID and not c.isKit)
where p.isKit
group by p.prodID, p.prodName, p.prodCost, p.prodPrice

c「コンポーネント」を表すために、2 番目の prodのエイリアスを使用しました。not c.isKitこれは再帰的には機能しないので、明示的に書きました。どちらも同じ結果を返すため、効率的な理由でunion allはなく使用されます。union

警告:

  • これは再帰的には機能しません (たとえば、キットが別のキットのコンポーネントを必要とする場合)。
  • これは、特定のアイテムの 1 つだけを必要とするキットでのみ機能します (たとえば、タイムトラベル キットが 2 つのフラックス コンデンサーと 1 つの Mr. Fusion を必要とする場合、これは機能しません)。
  • 私はこれをテストしていないので、マイナーな構文エラーがあるかもしれません.
  • prodStockこれはフィールドのみを計算します。他のフィールドを実行するには、同様のロジックが必要です。

クエリが想定よりもはるかに複雑である場合は、申し訳ありませんが、これがうまくいく解決策を見つけるのに役立つことを願っています.

キットを購入した場合のデータの扱い方ですが、これはprodStock構成部品のみに格納することを前提としています。たとえば、サプライヤからタイム マシンを購入した場合prodStock、タイム マシンの製品を増やす代わりに、フラックス コンデンサとミスター フュージョンを増やします。

于 2010-06-03T10:31:16.993 に答える