我正在开发一个项目,该项目使用表格将所有餐馆数据存储在同一个表格中。
包含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网站。
答案 0 :(得分:2)
简短而简单:是,改变它(这称为database normalization)。
表中包含3个列的一百万行并不是什么大问题。你可以选择添加两个表而不只是一个:minimum_order (restaurant_id, minimum_order_id, amount)
delivery_area (restaurant_id, area_id, minimum_order_id)
这将为您提供优势,即一组区域更改的金额,只需更新minimum_order
的金额,而不是minimum_order
上的多行(每个区域一个)。 / p>
答案 1 :(得分:0)
这绝对是一个好举措。不建议对数据库进行反规范化以减少行数。这样做有几个缺点。目前您似乎正在存储区域ID逗号分隔。在这种情况下,按区域ID搜索时无法使用索引。或者您可能已经为delivery_area_1,delivery_area_2,delivery_area_3字段使用了“全文索引”。
如果行数增加,那么您可以尝试分区技术。
请参阅http://dev.mysql.com/tech-resources/articles/partitioning.html