我正在尝试在我的数据库中搜索具有特定media
和attributes
的所有tags
元素。查询非常复杂,因为它目前执行以下操作:
Media
表中搜索Hash
,如果它与MD5哈希的正则表达式匹配。Attributes
搜索与Media
相关联的Name
,称为Description
,Source
和WHERE LIKE
,并且对搜索查询中的每个单词执行OR LIKE
,使用正则表达式/\s+/
进行拆分。Tags
,使用Description
检查LIKE
中的完整搜索字符串,然后使用完整搜索字符串检查Name
和Slug
个别的话。目前,我正在使用一大块PHP将整个查询拼凑在一起然后使用DB::raw
,并且不能正常工作。由于我没有正确使用它,因此我认为它不相关,但我没有包括在内,但如果需要,我会包含它。
这实际上是否可以使用Laravel Eloquent或Fluent?我咬的比我现实中可以咀嚼的还要多吗?
这种搜索程度真的有必要吗?有没有更好的方法来查找具有特定标题,描述,来源和标签的项目?
谢谢。
我的Media
表:
我的Attributes
表:
我的Tags
表:
我的Tag_Media
表:
答案 0 :(得分:0)
使用您的查询连接四个表并且连接是最慢的SQL操作,如果可以的话,您可能希望将所有这些表合并到一个更大的列中,并且已经存在所有列。 你会在重复输入时浪费内存,但通常可以提高查询性能。
DB架构的一种可能替代方案,包含2个表(无重复项):
我的媒体表:
我的标签表:
数据库架构的一种可能替代方案,包含1个表(对于每个媒体,您需要具有相同媒体值和不同标记值的重复条目):
我的媒体表:
还尝试索引您需要搜索的列。 对于这种情况,这可能是太重武器,但非关系数据库可能会给你更好的表现。