我听说过几种实现标记的方法; 使用TagID和ItemID之间的映射表(对我有意义,但它是否可以缩放?),向ItemID添加固定数量的可能TagID列(似乎是一个坏主意),将标记保留在逗号分隔的文本列中(声音疯了,但可以工作).我甚至听过有人推荐稀疏矩阵,但那么标签名称如何优雅地增长?
我错过了标签的最佳做法吗?
我很想知道Stack Overflow的标记和搜索是如何构建的,因为它看起来效果很好.
如果我想要执行以下所有操作,那么什么是良好的数据库/搜索模型:
也许以标准化的形式存储标签是有意义的,但也可以作为空格分隔的字符串用于#2,#4和#3的目的.思考?
我听说它说Stack Overflow使用Lucene进行搜索.真的吗?我听过几个关于SQL优化的播客,但没有关于Lucene的内容.如果他们确实使用Lucene,我想知道有多少搜索结果来自Lucene,以及"钻取"标签云是否来自Lucene.
我正在尝试像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在我的数据库模式中发现了这个问题,你如何做多对多表外连接?
编辑
我知道在示例制造中应该真的是车辆表中的一列,但是假设你不能这样做.这个例子只是一个例子.
我知道这个主题已经详细讨论了(我在这里和网上都阅读过很多帖子)而且我不喜欢鞭打死马,但我对整数ID与GUID的更具体方面有疑问:
我正在编写一个模式,它将具有与stackoverflow标签类似的标记功能,但它将使用相同的标签对5个不同的表使用.
我要链接的基本表格如下:
标签表
Tag ID Tag Name Tag Description
-------------------------------------------------------------
1 Hats Tag for hats
2 Coats Tag for coats
3 Gloves Gloves tag
4 Ladies Ladies item
Run Code Online (Sandbox Code Playgroud)
项目表1
Item ID Item Name Cost
------------------------------------------------------------
1 Deerstalker £20.00
2 Fedora £50.00
3 Scarf £15.00
Run Code Online (Sandbox Code Playgroud)
我遇到麻烦的是tag_item桌子.
我将有5个具有完全不同结构的表,我希望用户能够应用标签,所以我想我需要执行以下操作之一:
table name/ table number以及标记所涉及的行的整数键GUID一行,这将独立于表格工作,使得获取某一行的所有标记变得更加容易.我不确定的是这将如何影响以下方面的表现:
在这种情况下是否有任何明显更好的选择,或者我可以阅读这个特定情况下的优势?
编辑:
对于任何感兴趣的人,下面是我决定的架构:
标签表
CREATE TABLE [dbo].[Sys_TagList](
[Sys_Tag_Primary] [int] IDENTITY(1,1) NOT NULL,
[Sys_Tag_Name] [varchar](50) NOT NULL,
[Sys_Tag_Description] …Run Code Online (Sandbox Code Playgroud) 我没有在4-5个月内接触到任何代码,所以今天回到它,通常需要一个星期左右的时间才能让我的大脑中的所有信息再次流过我的大脑.所以我即将开始的项目将是一个PHP/MySQL后端书签数据库.
我想用我最喜欢的网站/书签创建一个很好的可搜索数据库.每条记录都会分配多个关键字,因此我可以轻松地搜索所有书签中的"php",并且所有关键字列或标题中包含"php"的记录将返回到结果集中.
到目前为止,这是我对数据库的想法......
auto_id = /*Auto incremented ID number for database*/
name/title = /*Name/title of the Website*/
description = /*brief description of the site*/
URL = /*URL to open when I click a link*/
clicks = /*increments by 1 everytime I click the link*/
date_created = /*datetime that URL bookmark was added*/
date_accessed = /*datetime field for when last clicked on*/
category = /*category name or number to create a folder like structure of bookmarks in groups*/
sub_category = /*some …Run Code Online (Sandbox Code Playgroud) 我是postgresql的新手,但我对mysql有很好的体验.我正在阅读文档,我发现postgresql有一个数组类型.我很困惑,因为我无法理解这种类型在rdbms中有用.为什么我必须选择这种类型而不是使用经典的一对多关系?
提前致谢.
我目前正在设计一个用于存储食谱的数据库模式.在这个数据库中,我希望能够标记不同类型的实体(成分,配方发布者,食谱等).所以标签有多个n:m关系.如果我使用"三表设计",这将导致我拥有的每种实体类型(食谱,配料,发行人)的表(交叉表).换句话说,每次我介绍一个实体时,我都要为它添加一个交叉表.
我正在考虑创建一个具有唯一ID的表,所有实体都引用该表,并且在tags表和"unique id"-table之间建立:m关系.这样,"unique id"-table和tag表之间只有一个交叉表.
以防万一有人会认为这个问题已被提出.我已经阅读了数据库设计标记.并且提到了三种表格设计.
我正在Android应用程序中实现标签,需要以下指针:
请注意,我已经看过一些专注于更大型服务器部署的设计,我正在寻找一些简单的东西,适用于移动(SQLITE)环境中的单个表.
首先想到的是,我正在考虑使用字符分隔的varchar来表示相关的标签,例如#work#meeting#monthly.有没有更好的设计方法呢?
我完全清楚可以通过一系列其他操作完成set division,所以我的问题是:
SQL中是否有集合划分命令?
我正在实现类似于StackOverflow标签系统的标签系统.我在考虑存储标签并与问题相关时,该关系将直接与标签名称相关,或者最好创建字段tagID以将问题与标签"链接"?看起来直接链接到标签名称更容易,但它看起来不太好,主要是为什么在使用统计和/或标签分类(恕我直言)时很难管理这个.另一个问题是当一个管理员决定"修复"标签名称时.如果没有tagID与标签名称分开,那么我将更改表格的键...
你有什么想法?
感谢所有回复.我将删除此帖子,因为有另一篇帖子具有相同的主题.我想知道为什么搜索和建议没有显示给我的结果......
我仍然开始关注整个关系数据库 - thingymawhatsit.无论如何,我是一个PHP程序员,所以我可以做所有那些shabang.我只需要考虑这个场景的最佳方法是什么......
我正在开发一个网站(如果有任何帮助,可以使用CodeIgniter) - 一个用户可以发布内容的网站(想想一个博客风格的东西).每个帖子都必须有标签,任意数量的标签,我不能仅限于3或5.这必须是无限的.
那我该怎么办?
只需要知道最好的,最逻辑的结构方式.考虑桌子彼此沟通是令人困惑的......!
哦,以及任何有任何CodeIgniter片段的人的奖励积分可能会让我继续前进;)
谢谢!
插口
我想在我正在研究的网站上实现标记系统.我对此有一个理论上的问题.我如何将这些标签存储在我的数据库中?
例如,如果我使用带有两列,标签和postId的表格,如果它很受欢迎,我可能会有一定数量的标签!所以我不确定这是不是最好的方法.
如果我想在帖子中添加标签,并且我有3个标签为"酷"的帖子,我会有以下内容:
tag-----id
cool----23
cool----12
cool----39
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?
tags ×7
database ×3
mysql ×3
php ×3
sql ×3
schema ×2
tagging ×2
android ×1
codeigniter ×1
foreign-keys ×1
postgresql ×1
primary-key ×1
set-theory ×1
sqlite ×1
t-sql ×1
tag-cloud ×1