数据库搜索价格的方法

时间:2016-04-26 06:58:43

标签: database database-design spring-boot

我即将建立一个平台后端,以寻找蔬菜供应商的最优惠价格。简而言之,客户能够过滤他感兴趣的蔬菜或水果,然后后端能够使用JSON进行响应,该JSON将返回供应商的名称和计算的价格。以下是我正在考虑关注Vendors Table的数据库示例:

+----+----------+--------+--------+--------+
| ID |   Name   | Potato | Tomato | Apple  |
+----+----------+--------+--------+--------+
|  1 | Example1 |      5 |      5 |      6 |
|  2 | Example2 |        |      2 |      3 |
|  3 | Example3 |      8 |      9 |     10 |
+----+----------+--------+--------+--------+

马铃薯,番茄和苹果的价值在下表中是FK(例如Potato Table

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

简而言之,当FK Potato第一个表中的值为空时,表示供应商不提供此产品。

我的问题是:数据库结构的这种好方法是否可以轻松添加供应商可能销售的新产品,并且是快速方法 - 当主表有多达10,000条记录时需要大量时间吗?如果没有,我需要实施哪些变更?

我正在考虑将SpringBoot作为我的后端。对于算法搜索,我正在考虑querydsl。

3 个答案:

答案 0 :(得分:8)

Many-To-Manyvendor之间存在vegetable关系,因此您需要另一个表来细分此关系,让我们将其命名为vendor_vegetable,其中可能包含{ {1}}表示主要2个表之间的每个新关系。 enter image description here

price中的每条记录都显示新价格,您可能需要在此表格中添加更多字段,例如新价格的日期

修改

您的设计不是那么好也不是动态的,考虑您需要添加一种新的水果或蔬菜(例如香蕉),然后您必须更改vendor_vegetable表以添加名为Vendors的新列,然后添加一个名为banana的新表。

如果您决定更改banana的名称

,该怎么办?

banana原则中,您的问题是众所周知的:SQL关系。 在此设计中,您只需要向Many-To-Many表添加新记录,然后当您需要将供应商的价格与此新扭结相关联时,您只需将新记录添加到vegetable表。

答案 1 :(得分: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);

答案 2 :(得分:0)

如果您描述的要求已经完成,则您不需要第二张表格。在第一个表中为每个供应商添加一行。 (至少我是如何解释第一个表,IDName是供应商的ID和名称。)然后,在每个水果列中输入供应商的价格。产品直接,你已经完成了。当价格为null时,这意味着供应商不会销售该产品。

另一种方法是为水果类型和供应商与水果之间的m:n关系建立一个单独的表。这在Making a table with fixed columns versus key-valued pairs of metadata?中进行了讨论。