相关疑难解决方法(0)

标记数据库设计

您将如何设计数据库以支持以下标记功能:

  • 项目可以包含大量标签
  • 搜索标记有给定标记集的所有项目必须快速(项目必须包含所有标记,因此它是AND搜索,而不是OR搜索)
  • 创建/写入项目可能较慢以启用快速查找/读取

理想情况下,使用单个SQL语句查找使用(至少)一组n个给定标记标记的所有项目.由于要搜索的标签数量以及任何项目上的标签数量未知且可能很高,因此使用JOIN是不切实际的.

有任何想法吗?


谢谢你到目前为止的所有答案.

但是,如果我没有弄错的话,给出的答案显示了如何对标签进行OR搜索.(选择包含一个或多个n标签的所有项目).我正在寻找一个有效的AND搜索.(选择所有包含所有n个标签的项目 - 可能还有更多.)

sql tags tagging database-design

167
推荐指数
6
解决办法
7万
查看次数

在数据库中存储标签的最有效方法是什么?

我在我的网站上实现了一个类似于stackoverflow使用的标记系统,我的问题是 - 什么是存储标记的最有效方法,以便可以搜索和过滤它们?

我的想法是这样的:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID
Run Code Online (Sandbox Code Playgroud)

这太慢了吗?有没有更好的办法?

database tags tagging database-design

132
推荐指数
4
解决办法
9万
查看次数

是否有一个商定的标记理想模式

我有一个照片网站,我想支持标签,因为我的原始类别桶开始失败(一些图片是家庭和假期,或学校和朋友).是否有商定的标记数据库架构?

我仍然希望支持将照片作为专辑的一部分.

现在我有几张桌子:

相片

  • PHOTOID
  • PhotoAlbumID
  • 字幕
  • 日期

相片集

  • ALBUMID
  • ALBUMNAME
  • AlbumDate

sql schema tagging

20
推荐指数
2
解决办法
7397
查看次数

数据库表是否应始终具有主键?

我的数据库表中是否应该始终有主键?

我们来看SO标签吧.您可以在任何修订中看到该标记,它可能位于带有postID和修订号的tag_rev表中.我需要PK吗?

此外,因为它在转换表中并且当前没有使用标签应该是一个tagID而不是多个post_id tagid对的多个条目?

database modeling primary-key

16
推荐指数
2
解决办法
3万
查看次数

如何设计数据库模式以支持使用类别标记?

我正在尝试像Database Design for Tagging这样的东西,除了我的每个标签都按类别分组.

例如,假设我有一个关于车辆的数据库.假设我们实际上并不太了解车辆,因此我们无法指定所有车辆将具有的列.因此,我们将用信息"标记"车辆.

1. manufacture: Mercedes
   model: SLK32 AMG
   convertible: hardtop

2. manufacture: Ford
   model: GT90
   production phase: prototype

3. manufacture: Mazda
   model: MX-5
   convertible: softtop
Run Code Online (Sandbox Code Playgroud)

现在您可以看到所有汽车都标有其制造和型号,但其他类别并不完全匹配.请注意,汽车只能拥有每个类别中的一个.IE浏览器.一辆汽车只能有一个制造商.

我想设计一个数据库来支持搜索所有梅赛德斯,或者能够列出所有制造商.

我目前的设计是这样的:

vehicles
  int vid
  String vin

vehicleTags
  int vid
  int tid

tags
  int tid
  String tag
  int cid

categories
  int cid
  String category
Run Code Online (Sandbox Code Playgroud)

我有所有正确的主键和外键,除了我无法处理每辆车只能有一个制造商的情况.或者我可以吗?

我可以在vehicleTags中为复合主键添加外键约束吗?IE浏览器.我是否可以添加一个约束,使得复合主键(vid,tid)只能在vehicleTags中没有行时才添加到vehicleTags,这样对于同一个vid,还没有一个tid在同样的cid?

我的猜测是否定的.我认为这个问题的解决方案是向vehicleTags添加一个cid列,并创建新的复合主键(vid,cid).它看起来像:

vehicleTags
  int vid
  int cid
  int tid
Run Code Online (Sandbox Code Playgroud)

这可以防止汽车有两个制造商,但现在我已经复制了tid在cid中的信息.

我的架构应该是什么?

在我之前的问题中,Tom在我的数据库模式中发现了这个问题,你如何做多对多表外连接?

编辑
我知道在示例制造中应该真的是车辆表中的一列,但是假设你不能这样做.这个例子只是一个例子.

sql tags schema foreign-keys entity-attribute-value

15
推荐指数
1
解决办法
1万
查看次数