mysql - 使用具有相同名称的多个表或具有较大编号的单个表。条目数

标签 mysql

我正在制作一个需要根据位置对产品进行排序的应用程序。提供了主要产品表,可用于在每个位置进行引用。每个位置可以有一组不同的主产品表引用。

例如:area_1 可以有product_1,但不能有product_5。

我正在考虑两种方法:

  1. 拥有表 table_area(areaId)、table_product(productId) 和 table_area_product(areaId, ProductId),并根据提供的 areaId 对产品进行排序。
  2. 拥有多个表,例如 table_area_product_{areaId},例如:area_1(table_area_product_1)。

How to write a mysql function with dynamic table name? ,此链接有助于使用动态表名称,但也说不要使用它,但我找不到任何进一步的解释。

产品数据最多可达 100 000 个条目,区域数据最多可达 300 个条目。随着时间的推移,两者很可能都会增加。

最好的方法是什么?还有其他选择吗?

最佳答案

出于多种原因,你的两个想法都很糟糕。

您应该有一个产品表,其中根本没有区域信息。

然后,您创建一个包含 areaproduct_id 的简单交叉引用表

假设您有北/南/东/西区域

表名称=area_product

area   |  product_id
North  |  1
North  |  2
North  |  5
South  |  1
South  |  2
South  |  6

等等。然后您只需学习如何在查询语法中使用 JOIN 即可。

SELECT p.*
FROM product p
    JOIN area_product ap ON p.id = ap.product_id
WHERE ap.area = 'North'

此结构的另一个好处是您可以向此交叉引用表添加有用的信息仅作为示例假设您希望仅在某个区域的特定日期之后提供产品。

area   |  product_id | start_selling
North  |  1          | 2016-01-01
North  |  2          | 2016-01-01
North  |  5          | 2016-07-01
South  |  1          | 2016-01-01
South  |  2          | 2016-07-01
South  |  6          | 2016-01-01

现在要查找北部地区的所有可用产品,您只需在条件中添加日期即可

SELECT p.*
FROM product p
    JOIN area_product ap ON p.id = ap.product_id
WHERE ap.area = 'North'
  AND ap.start_selling < NOW()

关于mysql - 使用具有相同名称的多个表或具有较大编号的单个表。条目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37631089/

相关文章:

mysql - SELECT 和 INSERT 到另一个表的字段

mysql - 将 "readonly"对象作为序列化数据存储在关系数据库中

php - 按在数据库中存储为 varchar 的 id 对 html 表进行排序

php - prestashop 的 Bad SubDomain SQL 查询错误

php - Flutter在尝试从php后端获取数据时返回null

mysql - 首先显示与 WHERE IN() 匹配的结果,然后显示其他结果 - MYSQL

mysql - "Every derived table must have its own alias"即使我给了他们别名

mysql - 在 SQL 数据库中选择重复的用户

mysql - 使用 Redis 缓存 SQL 结果

MySQL - 仅当所有行都不为空时求和,否则返回空