我有一个名为列表的对象,列表可以有许多便利设施(将其与帖子、标签模型进行比较)。这是一种有/没有关系。所以我有一个amenities
表格,它存储系统中可以有哪些便利设施,还有listings
一个存储列表的表格,listing_amenities
它存储便利设施。
问题是根据便利设施搜索列表
我可以根据列表的任何参数(租金、位置等)搜索列表,但不能根据便利设施搜索列表,因为这需要 2 表连接。我还没有真正想出一个有效的解决方案来做到这一点。因此,我想就如何在此基础上进行搜索提供一些帮助。
我能想到的一个解决方案是注入一个额外的字段,其中包含一组便利设施
SELECT *
FROM(SELECT listings.*, GROUP_CONCAT(CONCAT("(",Concat(amenity_id,")"))) as amenities
FROM `listings`,`listing_amenities`
WHERE listings.id=listing_amenities.listing_id
GROUP BY listings.id) as rs
WHERE amenities like "%(1)%"
即连接并添加包含在 () 中的设施 ID 并搜索它们
这让我想到:便利设施仅用于列表上下文和搜索,所以为什么不以类似的格式(1)、(2)存储它们以在列表表的单独列中指示可用的便利设施并保存在表格中和额外的查询费用?这种方法有什么缺点(如果有的话)?
为了更容易理解表格
Listing Table
--------
id title description rent
Amenities
-------------
id name description
Listing_Amenities
------------------
id listing_id amenity_id
我想我可以删除第三张表
并修改列表
Listing Table
--------
id title description rent amenties(the amenities available in the appartment wrapped in bracket)
喜欢
1 "House in Downtown Discworld" "Nice house, running water, teleporter" 2000 "(1)(5)(7)"
这种让我无需加入即可按便利设施进行搜索。我可以在选择租金的地方运行相同的查询
并使用 where 子句搜索: where amenities like "%(1)%" AND amenities like "%(2)%"
我在这种方法中看到的唯一问题是删除异常,即如果我从系统中删除设施,它不会自动从列表中删除设施
但我认为这不太可能发生,因为设施是由管理员决定的,并且在网站启动之前几乎会被冻结,其次,虽然我们可能会添加新的设施,但我们不太可能删除任何设施。
有没有其他的缺点。你能强调一下具体的场景吗?我认为这比加入更有效。坦率地说,更容易把我的头包起来。我可能是错的