【问题标题】:How effective can this Tagging solution be?这种标记解决方案的效果如何?
【发布时间】:2010-05-15 00:15:50
【问题描述】:

我在一个图片分享网站上工作,想为图片添加标签。

我已阅读问题#20856#2504150

我对上述问题的方法没有什么顾虑。首先,将图像链接到标签看起来很容易。然而,通过标签关系获取图像并不容易。不容易,因为您必须从一个表中获取图像到标签的关系,然后使用一堆 OR 语句(每个图像一个 OR)进行大查询。

在我研究标记主题之前,我开始测试以下方法:

此表为例:

Table: Image
Columns: ItemID, Title, Tags

Table: Tag
Columns: TagID, Name

Image 表中的 Tags 列从 Tag 表中获取一个包含多个 tagID 的字符串破折号(-)。

例如:

-65-25-105- 

使用 TagID 65,25 和 105 链接图像。

使用这种方法,我发现按标签获取图像更容易,因为我可以通过一个查询获取 TagID,并通过另一个简单查询获取所有图像,例如:

SELECT * FROM Image WHERE Tags LIKE %-65-%

所以如果我使用这种方法进行标记,

效果如何?

按 LIKE %-65-% 查询是一个缓慢的过程吗?

我将来会遇到什么问题?

【问题讨论】:

    标签: php sql tagging


    【解决方案1】:

    您需要 3 张桌子。

    Table: Image
    Columns: ImageId, ItemID, Title
    
    Table: Image_Tag
    Columns: ImageId, TagId
    
    Table: Tag
    Columns: TagID, Name

    然后获取您将使用的标签的所有图像:

    SELECT ImageId, Title 
    FROM Image_Tag LEFT JOIN Image USING (ImageId)
    WHERE TagId = $TagId

    这是在关系数据库中处理多对多关系的典型方式。阅读http://en.wikipedia.org/wiki/Database_normalization

    ,您可能会受益

    编辑:我看到这已经在您引用的其他问题中得到解决,因此我将进一步解释。我看到的最大问题是您无法利用索引 id 列的优势,这会降低查询效率。看起来更新起来也很笨拙。我强烈建议不要尝试这样做,至少尝试使用 3 table 解决方案。一旦它为您“点击”,您就会感谢我。

    【讨论】:

    • 感谢您的意见,只是我已经阅读了大量关于 LEFT JOIN 速度慢的故事。我会用三张桌子,人们似乎真的很喜欢这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多