2011-12-21 12 views
0

特定の会社の販売およびサービス用のテーブルを持つデータベースを作成したいとします。単一のセルにリストまたは配列を表すオブジェクトのように格納する方法がある場合、私が知りたいことは(私はSQLをあまり知らないので)。どうして? Salesテーブル内のセルが、その特定の販売を生成したすべてのサービスを指すようにしたいからです。例:複数のアイテムや要素をSQLセルに入れるにはどうすればよいですか?

service_1、service_2、...、service_nによって生成された09/09/11の販売。ここでservice_#はこの特定の会社が提供する特定のサービスです。再び私の愚かさを謝りますが、私はSQLを学ぶ過程にあります。

SQLサーバーにデータベースを作成する予定です。

+1

..私はできます1つのセルに複数の値を格納する方法を投稿しますが、私はむしろそうではありません。それは良いアプローチではないからです。私はそれを前もってお支払いしたいと思います。そして、初心者が間違いを犯さずに、これは、あなたがそれを体験することなくそれから学ぶことができる1つの事柄ですから。ここでは、多くの人のうちの一人が、最後まで読んでみるべきです。http://www.agiledata.org/essays/dataModeling101.html – Nonym

答えて

2

大まかには、1つのセルに複数のものを追加するとすぐに、データベース設計を変更します。テーブルを分割します。 Salesと呼ばれるもう1つのテーブルを使用します。もう1つはServicesと呼ばれ、最後には2つのテーブルを結合します。これには、参加する販売サービスとサービスのIDが含まれます。

5

これは悪いアプローチです。 データベースは正常化されている必要があります。あなたはfirst normal formにないデザインを作ることを話しています。あなたがのためにlokingされ

はNである:Mリレーションシップ、あなたはsale_servicesと呼ばれる新しいテーブルを作成する必要があります他の人のよう

sales (saleId, ...) 
services (servideId, name, price, ...) 
sale_services(saleId, serviceId) 
2

を言っているだけ配列を格納したいことは、あなたがしているサインです間違った設計。データの配列が必要な場合、本当に必要なのは、個々のレコードにその情報を格納する関連テーブルです。

私が話したいことは、配列をフィールドに格納することをコンマで区切って決めるとどうなるかということです。

製品の使用可能な色を色というフィールドに格納するとします。

今、あなたは今、あなたは赤で来るすべての製品見つけるのですか万レコード

ため

Product Colors 
item1 red, blue, yellow 
item2 blue, purple, red 

などがありますか?配列フィールドは正しく照会するのが難しく、そうしたときのパフォーマンスは一般には深刻です。新しい色を追加することは、特にそれが特定の順序になるようにしたい場合は、苦労します。

データベースの設計に進む前に、正規化とデータベース設計について読む必要があります。データベース設計の最初の規則の1つは、です。NEVERは、レコードのフィールドに複数の情報を格納します。これは複雑な問題であり、早期に間違った選択をすると、システムが停止する可能性があります。データベースは単純ではなく、リファクタリングが容易であるため、デザインを作成する際に何をしているのかを知る必要があります。

+0

ありがとう。私は正規化の詳細を学び、どのようにしてより良い解決策を見出すことができるかを見ていきます。私の問題は、販売とサービスの間の関係のための別のテーブルを生成できなかったことです。これは、サービスの任意の組み合わせによって単一の販売が生成されるためです。私は、異なるサービスのすべてのバリエーションを持つ別のテーブルを持つことはできません。それは大きすぎます。だから、おそらく私は私のDBを再設計する必要があります。 – user990692

+0

次に、salesテーブルとservieテーブル、およびSalesServiceというリンクテーブルが必要になります。また、SQL Serverは数兆のレコードを簡単に処理できることを覚えています。インデックスを適切に作成する限り、SQL Serverは大きすぎることに真剣に疑いを持ちます。 – HLGEM

+0

すべてのコメントありがとう。あなたが言うように私はやります。我々は学ぶために住んでいる:) – user990692

1

多くの良いコメントがここにあります。

あなたは一歩踏み込んで、あなたのデータベースのより大きな写真を見たいかもしれません。ここのコメントは、テキストブックだけでなく、実践的な経験から来たものです。あなたのデータで何が起こるかを見てみましょう。あなたの例で言及したように、単一のセルにサービスリストを格納した場合、どのサービスが最も多く実行されたかはどのように判断できますか?どのようなサービスが一度も使われていないのはどうですか?ソリューションですべての「行」を読み込んで何かを行う必要がある場合は、より良い方法があります。正直に言うと

あなたが一緒に提案し、設計を置く場合は、それを改善するために、ここで多くの人々は、あなたがそれを微調整するのに役立ちますし、微調整は...

幸運...

+0

再び申し訳ありません。どのように多くのサービスが売り上げを参照するのか分からない場合は、テーブルを正規化することができます。例:Sale1はServiceId_1、ServiceId2、ServiceId_6、...を参照することができます。また、ServiceId_8、ServiceId_10などでも構いません。 – user990692

+0

データベースを完全に再設計する必要がない限り、1つのフィールドに複数の値がある場合は、個々の値を保持するテーブルを作成します。テーブルには、最初のテーブルにリンクしたIDと各要素を保持するフィールドが含まれている必要があります。このように、各サービスはテーブル内の独自の行になるため、結合テーブルに新しい行を追加するだけで、任意の数のサービスを処理できます。 DaniHpの答えを見ると、Sale_serviceテーブルは複数のサービスを分割する方法の例です。 – Sparky

関連する問題