我正在尝试实现类似于StackOverflow标记功能的功能。用户可以创建新标签,或者通过键入拉出已创建的类似标签列表。
这是这个网站上的一个很棒的功能,我觉得很遗憾,大多数网站都没有这样的东西。它既健壮,又非常灵活,最重要的是:由社区推动。
所以我有这两个表:
Company
id
email
name
companySize
countryOfOrigin
industryid
Industry
id
description
每次用户编写新标记时,我都希望创建一个具有唯一ID的标记,并且还能够搜索现有标记。
此数据库设计是否可以轻松有效地实现此功能?
如果没有,请给予一点指导。 :)
答案 0 :(得分:1)
虽然没有大量的信息可以继续,但你列出的内容应该没问题。 ('tag'是行业表中的'description'字段等)
正如您可能想象的那样,所有实际工作都是在SQL之外完成的,您需要...
...每次编辑行业时。
也就是说,您提出的设置的关键限制是每个公司只能属于一个行业。 (即:它只能有一个与之相关的行业标签。)
因此,您可能需要考虑一个符合......
的模式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上保留一个索引,就能快速显示所有唯一标记。