2011-07-14 8 views
0

私は可能な限り短く状況を説明することができます:ベストメソッド - vb.netとmysql

私は宝石会社の修理システムを作っています。シンプルに、私は顧客テーブルと修理テーブルを持っています。顧客テーブルは顧客情報を保持し、修理テーブルは顧客修理情報を保持する。修理テーブルと顧客テーブルは、customer.ID列(修理テーブルのcustomer_id)によって結ばれています。

システムには、顧客の既存の修理を表示するオプションがあります。特定のcustomer_idに一致するすべての修理が表示されます。

私がこのシステムを作っているクライアントは、修理を一緒にする方法を望んでいます。例:顧客johnがシステム内で4つの修理を行っている場合2つの修理は新しく、2つは完了です。 2つの新しい修理が完了したになるまで顧客に連絡しないようにする場合は、既存の修理すべてを確認し、それらの2つをチェックして、「修理をする」ボタンをクリックします。

私はこれらの修理を結びつける最善の方法を考えるのに困っています。修理が完了するまで、顧客は電話リストに表示されません。私が思い付くすべてのオプションは、欠点を持っているようだが、それほど効率的ではない。

修復テーブルにtied_repairsという別の列を作成して、すべての結合修復のIDをaで区切って入力します。 (または任意の文字)?

ありがとうございました。

答えて

1

デリミタを使用して複数の値を1つのフィールドに入力することはありません。これはあらゆる種類の頭痛を引き起こす。あなたはそのようなフィールドでどのように検索しますか?あなたはどのようにジョインしますか?データベースエンジンはどのようにインデックスを作成しますか?あなたは文字列処理の全体の束を行う必要があります。それは悪いニュースです。

実際の要件が何であるかに応じて、2つの解決策があります。

Secnario 1:実際の要件が「顧客は保留中の修理がすべて完了するまで呼び出されたくないと言うかもしれませんが、顧客テーブルのフィールドはブール値です。 "修理が不完全であれば電話しない"。通話のクエリは次のようになります。

select customername, whatever 
from customer 
join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false 
where customer.allOrNothing=false 
or not exists 
(select 1 from repair ri where ri.customerid=customer.customerid and ri.completed=false) 

シナリオ2:実際には、修復を任意の組み合わせで行う必要があります。すなわち、顧客は、両方が完了するまで1または3の修理のために呼びたくないと言うかもしれないし、両方が完了するまで2または5に呼ばれることを望まないが、4他に何もされていない場合、または1と3、または2と5の場合。事務員がデータを入力して管理するのは非常に複雑ですが、大丈夫です。

新しいテーブルが必要な場合は、RepairTiesという名前を付けてください。このテーブルには、RepairTieIdとRepairIdという2つの列があります。このようなネクタイを作成するたびに、「結合セット」の修復ごとに1つのレコードを作成します。セットを識別するためにRepairTieIdを作成します。 RepairTieIdの価値は、それ自身の何も意味しません。修復記録をまとめて結ぶだけのものです。もしそうなら、「アンカーポイント」。個々の修復記録に依存しないものにすべての修復記録を添付できるように、これが必要です。 (#1を修復するために#2修復を結びつけたくないということに注意してください。修復が3つあるなら、#2と#3を#1に結びつけます。 #2と#3が結びついています...#1と#2が結ばれているという事実を失いたくはありません。

はその後、クエリは次のようになります。

select customername, whatever 
from customer 
join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false 
where not exists 
(select 1 from repairtie t1 
join repairtie t2 on t1.repairtieid=t2.repairtieid and t2.completed=false 
where t1.repairid=rc.repairid) 

通常の免責事項:私はこれのいずれかをテストしていませんが、それは私の頭の上からすべてですので、細部に誤りがあるかもしれませんが、原理は動作するはずです。

+0

ありがとうございました。私は1つの列に複数の値を入れることはノーであることを知っています。同僚がこれを行い、私はいつもそのアイデアを嫌っていました。テーブル/コラムを扱うとき頭痛を与えます。ありがとう! – Jeff

1

この同じ問題をアプリケーションで解決しました。

さらに別の列を追加しましたが、文字で区切ったIDを含めてという悪いアイデアデータベースです。私たちは、むしろこれをしなかった:

我々は一例で重要な列のテーブルrepairsを持っていた:

  • REPAIR_ID
  • CUSTOMER_ID
  • REPAIR_STATUS(...、完成忙しく、またはパーセント、または日付)

および第3の列を追加しました。REPAIR_TIE

ここでは、すべての修理にはREPAIR_TIEと同じ番号が付いています。これは最低のREPAID_IDになります。

今はお互いに簡単に

  • タイ修理が
  • ほぐし修理(最低 REPAIR_IDへのすべてのREPAIR_TIEを更新)
  • チェック(独自のREPAIR_IDに戻すREPAIR_TIEを設定する)ことができ、すべての修理であればREPAIR_TIEと同じステータスを持つ(または最小ステータスを取得するか、またはまだ推定された作業日数を取得するか、または)
+0

素晴らしいです!私は何かが欠けていることを知っていた。どこにデータベースのための素晴らしいアイデアではありません。あなたの応答を感謝します! – Jeff

+0

他の人が示唆しているように、もっと情報があれば、本当に第3のテーブル 'repair_ties'を作ることができます。アイデアは同じです:行は同じ値で修復します...などですが、 'repair_ties'(または' orders'など)テーブルのフィールドと同じ値でフィールドをグループ化できます。 – Konerak

+0

シナリオ2の解決策を他のポストゲットで使用しましたが、2つのテーブルが自分の状況でうまく機能しましたが、助けてくれてありがとうございます。 – Jeff

1

1対多の関連性を持つ新しいテーブルを作成して、修復をグループ化することができます。

enter image description here

1

修復が完了するたびに、偽= RepairTable.Completed得意先のために修理テーブルにselect文を実行します。結果がない場合は、レコードをCallListテーブルに追加します。結果がある場合、修理業者は顧客にもう一度開いている修理があることを知っています。このルートが厄介になる唯一の方法は、お客様が修理をキャンセルした場合、CallListテーブルに対して最近完了した修理を実行して、呼び出されていないものがあるかどうかを確認する必要があります(返品されたフィールドこれを単純化することができる)。

1

あなたの正しい答えはあなたによって異なります。

より良いアプローチは

"オーダー= {ID、顧客、状態、高度、savedby、editby、cancelledby、requestdate、cancelldate、updatedate}

" 及び「orderdetail = {呼ばintermediumエンティティを作成ありますID、順序、たOrderDetails、attendby、status_service、ステータス、dateattended、ノート} "

または

ロジックをお勧めしますしないように使用することは非常に簡単です

順序を持つクライアントが

select bla, bla 
from customer c 

inner join 
(select customerid, ordernumber, count(*) services 
from repairs 
where repairs.status = {1 | 'A' | your status for entity} 
group by customerid, ordernumber 
) order 
on order.customerid = c.id 


left join 
(select customerid, ordernumber, count(*) servicesdone 
from repairs 
where repairs.status = {1 | 'A' | your status for entity} 
and servicestatus = 'COMPLETED' 
group by customerid, ordernumber 
) orderdone 
on orderdone.customerid = order.customerid 
and orderdone.ordernumber= order.ordernumber 

where order.services = orderdone.servicesdone 
を完了見つけるためにそう

notshowagain呼ばrepaisでservicestatus

追加された列と呼ばrepaisで

追加された列を注文番号と呼ばれるrepaisで追加された列

- ステータス、またはリクエストの日付でフィルタリングできる中間テーブル "注文"がありますか - 一部でショーノートO、によってattendeによって高度の割合、どのような技術的発見(ノートで)

今あなたが

1.-「notshowagain」

2方法を登録SQLを実行してマークすることができます。 - ユーザーマークを付けてください( "notshowagain")

私は秒を好む

関連する問題