2016-04-26 9 views
3

私は野菜の売り手のベスト価格を検索するためのプラットフォームのバックエンドを構築しようとしています。要するに、顧客は関心のある野菜や果物をフィルターに掛けることができます。そして、バックエンドはJSONで応答し、ベンダーの名前と計算された価格を返します。ここで私はVendors Table次検討していますデータベースの例である:検索価格へのデータベースへのアプローチ

ポテトの値は、トマトとAppleはFKの次の表に(たとえば Potato Tableためです
+----+----------+--------+--------+--------+ 
| ID | Name | Potato | Tomato | Apple | 
+----+----------+--------+--------+--------+ 
| 1 | Example1 |  5 |  5 |  6 | 
| 2 | Example2 |  |  2 |  3 | 
| 3 | Example3 |  8 |  9 |  10 | 
+----+----------+--------+--------+--------+ 

:、短期でそう

+----+-------+ 
| ID | Price | 
+----+-------+ 
| 5 | 10 | 
| 8 | 20 | 
+----+-------+ 

FK Potatoの最初のテーブルの値がnullの場合、ベンダがこの製品を提供していないことを意味します。

私の質問は、ベンダが販売する可能性のある新しい製品を簡単に追加することです。早いach - メインテーブルに最大10,000個のレコードがある場合、多くの時間が必要でしょうか?そうでない場合、私はどのような変更を実装する必要がありますか?

私はバックエンドとしてSpringBootを検討しています。アルゴリズムの検索では、私はquerydslを検討しています。

+3

いいえ、それは良いデザインではありません。 –

+0

@MitchWheat、それを変更する方法はありますか? – uksz

答えて

8

あなたは、この関係を打破するために、別のテーブルを必要とするので、メイン2つのテーブル間のそれぞれの新しい関係のためpriceが含まれているかもしれない私たちはそれvendor_vegetable名前を付けてみましょう、vendorvegetableMany-To-Many関係を有しています。

あなたのデザインあまりよくないも: enter image description here

vendor_vegetableの各レコードは、新しい価格を公開し、あなたは

編集新しい価格を置くの日のように、このテーブルに複数のフィールドを追加する必要があります動的、新しい種類の果物や野菜(例:バナナの場合)を追加する必要があると考えてください。テーブルを変更してbananaという新しい列を追加し、bananaという名前の新しいテーブルを追加する必要があります。

bananaの名前を変更するとどうなりますか?

SQLの原則では、問題は既知のものです。Many-To-Manyの関係です。 このデザインではvegetableテーブルに新しいレコードを追加するだけです。ベンダーの価格をこの新しいキンクとリンクさせる必要がある場合は、新しいレコードをvendor_vegetableテーブルに追加するだけです。

+0

良いデザイン。深く議論するために、私はあなたの 'vendor_vegetable'フィールドの日付範囲のようなテーブルを持っていますが、価格は時間的に異なる可能性があります。例:市場の計画された日の行動の詳細(私のプロジェクト:次の木曜日)、または国際的な将来の取引を想像してください。現在のオフィシャルオファーは時間制限があります。 –

+0

複数の結合でクエリを実行しようとすると、この構造のパフォーマンスはどうなりますか?これは1つの大きなテーブルよりも優れている/より効率的ですか? btw、他の回答が何も表示されない場合、私はあなたに賞金を与えます – uksz

+1

これはこの問題の標準的な構造ですが、DBMSプロバイダは最高のパフォーマンスを得るために特定のクエリを最適化しています。 MySQLサイトのhttp://dev.mysql.com/doc/sakila/en/sakila-structure-tables-film_actor.htmlからこの例を参照してください。 – wajeeh

0

あなたはこのことについて考えることができます。

CREATE TABLE `test_delete`.`vendors` (
    `id` INT NOT NULL COMMENT 'Unique ID of the Vendor', 
    `name` VARCHAR(40) NULL COMMENT 'Name of the Vendor\n', 
    `area` VARCHAR(200) NULL COMMENT 'Area where the vendor is located', 
    `is_active` VARCHAR(45) NULL COMMENT 'Whether or not the vendor is active.', 
    PRIMARY KEY (`id`)); 

CREATE TABLE `test_delete`.`items` (
    `id` INT NOT NULL COMMENT 'Unique ID of the item', 
    `item_name` VARCHAR(40) NULL COMMENT 'Name of the item', 
    `item_price` DOUBLE NULL COMMENT 'The price of the item', 
    `is_active` VARCHAR(45) NULL COMMENT 'Whether the item is discontinued or not.', 
    PRIMARY KEY (`id`)); 

CREATE TABLE `test_delete`.`vendor_item_availability` (
    `id` INT NOT NULL COMMENT 'Unique ID of the Item Vendor Availability matrix.', 
    `vendor_id` INT NULL COMMENT 'FK Vendor ID from Vendors table.', 
    `item_id` INT NULL COMMENT 'FK Item ID from Items table', 
    `availability_count` INT NULL COMMENT 'Count of items available', 
    PRIMARY KEY (`id`), 
    INDEX `fk_vendor_id_idx` (`item_id` ASC, `vendor_id` ASC), 
    CONSTRAINT `fk_item_id` 
    FOREIGN KEY (`item_id`) 
    REFERENCES `test_delete`.`items` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `fk_vendor_id` 
    FOREIGN KEY (`vendor_id`) 
    REFERENCES `test_delete`.`vendors` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 
+0

より広い目的に役立つように少し修正しました – MontyPython

0

あなたが記述要件が完了している場合は、2番目のテーブルは必要ありません。最初のテーブルに各ベンダーの行があります。 (少なくとも、最初のテーブルIDNameはIDとベンダーの名前であると解釈します)。次に、各フルーツの列に、この製品のベンダーの価格を直接入力します。価格がnullの場合、ベンダーは製品を販売していないことを意味します。

代わりに、フルーツのタイプとベンダーとフルーツのm:nの関係について別のテーブルを用意することもできます。これはMaking a table with fixed columns versus key-valued pairs of metadata?で議論されています。

関連する問題