如果我希望用户保存标签,并且能够调用已使用过的标签,我需要使用哪种数据库设计?

时间:2010-01-23 23:34:15

标签: sql database feedback

我正在尝试实现类似于StackOverflow标记功能的功能。用户可以创建新标签,或者通过键入拉出已创建的类似标签列表。

这是这个网站上的一个很棒的功能,我觉得很遗憾,大多数网站都没有这样的东西。它既健壮,又非常灵活,最重要的是:由社区推动。

所以我有这两个表:

Company
    id
    email
    name
    companySize
    countryOfOrigin
    industryid

Industry
    id
    description

每次用户编写新标记时,我都希望创建一个具有唯一ID的标记,并且还能够搜索现有标记。

  

此数据库设计是否可以轻松有效地实现此功能?

如果没有,请给予一点指导。 :)

2 个答案:

答案 0 :(得分:1)

虽然没有大量的信息可以继续,但你列出的内容应该没问题。 ('tag'是行业表中的'description'字段等)

正如您可能想象的那样,所有实际工作都是在SQL之外完成的,您需要...

  1. (可能)添加尚不存在的新标签。
  2. 将行业与提供的标签相关联。
  3. (可能)修剪以前使用的标签可能已不再使用。
  4. ...每次编辑行业时。

    也就是说,您提出的设置的关键限制是每个公司只能属于一个行业。 (即:它只能有一个与之相关的行业标签。)

    因此,您可能需要考虑一个符合......

    的模式
    Company
        id
        ...
        countryOfOrigin
    
    Industries
        id
        description
    
    CompanyIndustriesLookup
        companyID
        industryID
    

    ...这可以让您将多个行业/标签与给定公司相关联。

    <强>更新...

    例如,在此设置下,要获取与公司ID 1关联的所有标记,您将使用...

    SELECT Industries.description FROM (CompanyIndustriesLookup, Industries)
    WHERE companyID=1 AND industryID=Industries.ID
    ORDER BY Industries.description ASC;
    

    在类似的基础上,为了让所有公司都被标记为“测试”行业,你会使用......

    SELECT Company.name FROM (Company, Industries, CompanyIndustriesLookup)
    WHERE Company.id=CompanyIndustriesLookup.companyID
    AND Industries.id=CompanyIndustriesLookup.industryID
    AND Industries.description="testing"
    ORDER BY Company.name ASC
    

答案 1 :(得分:0)

使用标签的一个非常简单的方法(如果有点不太理想,但通常无关紧要)就是根本没有标签ID。所以,你有:

Items
    ItemId
    Name
    Description
    ...

ItemTag
    ItemId 
    Tag

向项添加标记只是将元组添加到ItemTag表中,无论标记是否已存在。而且您也不必对删除标签进行任何记账。只需在ItemTag.Tag上保留一个索引,就能快速显示所有唯一标记。