9001cc金沙

网站珍藏职能数据库设计:表结构与实现思路

网站珍藏职能数据库设计:表结构与实现思路

网站珍藏职能数据库设计的主题,是把“谁珍藏了哪个网站、网站有哪些信息、珍藏属于哪个分类、是否增长标签以及何时操作”保留明显。一个实用的珍藏网站不应只成立一张用户表和一张网址表,而应分辨用户、珍藏纪录、分类目录、标签和操作状态。这样既能支持基础珍藏,也便于后续扩大搜索、排序、取缔珍藏、公开分享等职能。

先明确珍藏职能中的数据关系

在业务上,用户与网站通常是多对多关系:一个用户能够珍藏多个网站,一个网站也可能被多个用户珍藏。因而,不能单一地在网站表中增长一个 user_id,也不宜直接把多个用户编号保留到一个字段里。

更合理的做法是将“网站信息”和“用户珍藏行为”拆开。网站信息用于保留标题、网址、描述等相对不变的内容;珍藏纪录用于暗示某个用户珍藏了该网站,并保留珍藏功夫、备注、分类和状态。

  • 用户表:保留用户账号、身份和基础状态。
  • 网站表:保留网站名称、尺度网址、描述等指标信息。
  • 珍藏表:衔接用户与网站,是珍藏职能的主题业务表。
  • 分类表:保留“开发工具”“设计资源”“进建资料”等目录。
  • 标签表:用于更矫捷地描述珍藏内容,例如 PHP、前端、文档。

主题表若何设计

若是系统只服务于单个用户,能够将珍藏纪录直接作为重要业务表;若是存在注册、登录和多用户珍藏,则建议选取用户表、网站表和珍藏表三层结构。下面的字段是常见设计,现实项目能够凭据业务领域弃取。

网站珍藏职能的主题数据表
数据表 关键字段 重要作用
users id、username、status、created_at 保留用户及账号状态
websites id、title、url、normalized_url、description 保留网站的基础信息
user_bookmarks id、user_id、website_id、note、is_starred、created_at 纪录用户是否珍藏及珍藏属性
bookmark_folders id、user_id、name、parent_id、sort_order 保留用户的分类目录
tags id、user_id、name 保留用户可沉复使用的标签
bookmark_tags bookmark_id、tag_id 成立珍藏与标签的多对多关系

用户表与网站表

用户表的主键通常使用自增整数或拥有唯一性的字符串标识。用户名、邮箱等登录字段必要设置唯一约束,账号状态能够使用正常、禁用等业务值。

网站表中的 url 保留原始地址,normalized_url 保留经过统一处置后的地址。两者同时保留有助于展示用户输入的原始网址,也便于去沉。尺度化时能够统一和谈、域名大幼写和末尾斜杠规定,但是否去除查问参数必要结合业务判断,由于部门查问参数可能代表分歧页面或推广起源。

网站标题能够由用户填写,也能够在提交后由系统尝试获;在无法获取页面信息时,标题仍应允许为空或使用用户自界说内容。图标、封面、页面提要属于可选信息,不宜作为珍藏纪录能否创建的必要前提。

珍藏表是职能的中心

user_bookmarks 表应至少蕴含 user_id、website_id 和 created_at。用户点击“珍藏”时创建一笔纪录,点击“取缔珍藏”时能够物理删除,也能够使用 deleted_at 进行软删除。选择软删除时,沉复珍藏前要明确处置规定:是恢复原纪录,还是创建新的珍藏纪录,不能让唯一约束与业务逻辑相互矛盾。

常用的扩大字段蕴含 note、is_starred、is_archived、last_viewed_at 和 updated_at。note 用于保留用户对网站的幼我备注;is_starred 能够支持“出格关注”或“置顶”状态;last_viewed_at 可用于“最近接见”排序。若系统只必要通常珍藏,不要为尚未使用的状态设计过多字段。

在统一用户不能沉复珍藏统一网站的前提下,可对 user_id 与 website_id 成立结合唯一约束。若业务允许统一个网址呈此刻多个目录中,不要在珍藏表中直接只保留一个 folder_id,而应增长 bookmark_folder_relations 关系表。这样一条珍藏能够同时放入多个分类,分类移动和批量整顿也更矫捷。

分类和标签应该若何分辨

分类通常暗示不变的层级目录,例如“工作资料”下面佑装后端开发”和“数据库”;标签则暗示横向特点,例如一个网站同时具佑装免费”“API”“教程”等属性。两者承担的作用分歧,不建议用一张表混合实现。

bookmark_folders 能够通过 parent_id 实现树状目录。顶级分类的 parent_id 为空,子分类保留父分类编号。创建、批改分类时,应查抄分类是否属于当前用户,并预防把分类移动到自身或自己的子分类下。sort_order 可用于保留用户自界说的目录挨次。

标签通常是用户级数据,因而 tags 表中能够设置 user_id 与 name 的结合唯一约束,预防统一用户沉复创建名称一样的标签。bookmark_tags 使用两个表键组成结合主键或结合唯一索引,预防统一个标签被沉复关联到统一条珍藏。

网址去沉与唯一约束不能忽略

珍藏网站时,用户可能别离输入带有末尾斜杠、分歧和谈或分歧大幼写的地址。若是直接对原始 url 判断沉复,容易出现统一网站多条珍藏纪录。数据库设计应先在利用层实现网址体式校验和尺度化,再将了局写入 normalized_url。

去沉规定要由产品需要决定。若系统只关切域名,能够按域名去沉;若系统保留的是具体网页,则应按齐全规范化 URL 去沉。对于统一域名下的分歧蹊径、分歧锚点和分歧查问参数,也不能在没有业务凭据时强行归并。

推荐在珍藏表上成立 user_id、created_at 的组合索引,以支持按用户查问和按珍藏功夫排序;在 user_id、website_id 上成立唯一约束,以支持急剧判断是否已经珍藏。若必要按标题或备注搜索,还能够凭据数据库能力成立全文索引,而不是只依赖吞吐查问。

珍藏、取缔珍藏和查问流程

用户执行珍藏操作时,系统应先验证网址体式,再处置网站信息,最后写入用户珍藏关系。网站已经存在时能够复用原有网站纪录;网站不存在时再创建新纪录。整个过程最好放在事务中,预防网站创建成功但珍藏关系写入失败。

  1. 确认当前用户拥有正常的珍藏权限。
  2. 校验 URL,并天生 normalized_url。
  3. 查找或创建网站基础信息。
  4. 查抄当前用户是否已有有效珍藏纪录。
  5. 创建珍藏纪录,并按必要关联分类和标签。
  6. 提交事务后返回珍藏状态。

取缔珍藏时,应按当前用户和珍藏编号进行操作,不能只凭据网站编号删除,不然可能误删其他用户的珍藏。查问珍藏列表时,同样必须带上 user_id 前提;后盾治理或公开分享场景则必要另行设计权限规定。

哪些字段适合放在珍藏表

判断字段归属时,能够看它描述的是“网站自身”还是“用户与网站的关系”。网站标题、网站地址和公共描述通常放在 websites 表中;幼我备注、星标状态、所属分类、珍藏功夫和最近查看功夫应放在 user_bookmarks 或关联表中。

例如,统一个网站被两个用户珍藏时,两个用户可能设置分歧的备注、标签和分类,因而这些内容不能放在网站表中。若网站标题允许每个用户自界说,则应额表设置 bookmark_title,覆盖网站的公共标题,而不是直接批改 websites.title。

面向扩大职能的设计建议

若是后续打算增长公开珍藏加注团队珍藏或珍藏分享,能够在珍藏关系上增长 visibility、owner_type 等权限字段,也能够单独成立分享表,保留分享令牌、有效期限和接见领域。权限判断应萦绕珍藏的所有者执行,不能仅凭前端传来的珍藏编号放行。

若是必要纪录网站失效、页面抓取功夫或标题更新状态,能够增长查抄状态、checked_at 和 error_message 等字段。自动查抄网址时应设置频率限度和超时处置,不要让页面接见失败直接删除用户珍藏。对用户来说,失效网址仍可能是有价值的汗青资料。

对于幼型珍藏网站,users、websites、user_bookmarks、folders 和 tags 已经可能支持大无数基础职能;当出现多分类、团队合作、分享权限或操作审计需要时,再拆分关系表和权限表。好的网站珍藏职能数据库设计并不是表越多越好,而是先保障珍藏关系清澈、数据不沉复、权限可判断,并为明确的扩大需要预留合理结构。

kj24rpbqywzgqxio7fkfkchfnw8iy
[责任编纂:袁莉]

为您推荐

热点文章

杰出视频

凤凰资讯官方微信
凤凰资讯官方微信
关注更多资讯
【网站地图】