2

我正在做一个项目,该项目使用一个表将所有餐厅数据存储在同一个表中。有一个单独的表格用于包含area_id和的区域area_name

有六个领域对我来说是问题的根源。他们是:

delivery_area_1 , delivery_area_2, delivery_area_3
minimum_order_1, minimum_order_2 and minimum_order_3

delivery_area_1字段包含一个逗号 (',') 分隔的所有area_id' 列表,其中餐厅以最低订单 1 交付,依此类推,用于交付区域 2 和 3。

当用户搜索area_id并且结果包含在该 area_id 中提供的所有餐厅时,相应的最小订单将与其他详细信息一起显示在结果中。

我建议将此交付区域数据移动到一个单独的映射表中,该表将包含:

restaurant_id, area_id and the minimum order.

但是这样做会导致 20,000 家餐厅的映射表中的条目数超过 1000,000。目前有 1000 家餐厅,但从现在开始,这个数字将迅速增加。每家餐厅在大约 30-80 个区域提供服务。

这是个好举动吗?这将是一个重大决定。所以请帮我解决这个问题。

有没有更好的方法来简化和优化搜索?

它是一个 PHP 网站。

4

2 回答 2

2

简短而简单:的,改变它(这称为数据库规范化)。

仅包含 3 个列的表中的一百万行并不是什么大问题。您可以选择添加两个表,而不仅仅是一个:

minimum_order (restaurant_id, minimum_order_id, amount)

delivery_area (restaurant_id, area_id, minimum_order_id)

这将为您带来优势,即一组区域的数量发生变化,只需minimum_order更新 at 的数量,而不是 at 的多行(每个区域一个)minimum_order

于 2012-05-09T09:00:57.560 回答
0

这绝对是一个好举措。不建议对数据库进行非规范化以减少行数。这样做会有几个缺点。目前您似乎正在存储 Area Id 逗号分隔。在这种情况下,您无法在按区域 ID 搜索时使用索引。或者,您可能对 delivery_area_1、delivery_area_2、delivery_area_3 字段使用了“全文索引”。

如果行数在增加,那么您可以尝试分区技术。

请参考http://dev.mysql.com/tech-resources/articles/partitioning.html

于 2012-05-09T09:15:41.343 回答