最近做项目,需要完成一种需求:用户可以为某种任意的model添加任何多个tag。一般来说常规的范式化设计在这种情况下使用一个字段一条记录来存储所有的tag,该记录中使用某种分隔符(如英文逗号,“|”等符号)来分隔各个tag,然后通过程序逻辑来解析tag。
这种做法最容易被想到,但也最容易出问题。
有几大问题是不可避免的:
1. 使用逻辑处理数据不能使用数据库的完整性依赖;
2. 不能保证用户输入永远合法;
3. 由于用户输入长度不定,因此可保存的tag数目不定。
因此,需要一种更加好的解决方案,该方案要对多种model具有兼容性,并且可以扩展任意多种类的tag。
设计一张table tags:
tags = {
:id => integer,
:tag_name => string,
:tag_type => integer
}
该表用于保存各种tag的具体类型和名字,比如:
tag_name => "北京", tag_type => 1
tag_name => "移动互联网", tag_type => 2
(在配置文件中写入locaiton = 1, market = 2)
然后设计一张关联table entity_tags:
entity_tags = {
:id => integer,
:entity_type => string,
:entity_id => integer,
:tag_id => integer
}
set foreign_key :tag_id references tags.id
这张表中,entity_type为使用tags的实体的类名,比如User;entity_id为实体的id;tag_id为外键,用于关联tags表。
如此,每当某个实体添加一个tag,首先去tags表中找相关类型的tag是否存在,如果不存在,则新增一个tag,然后去entity_tags表中生成一条关联信息,比方说:
tags(:id => 1, :tag_name => "北京", :tag_type => 1)
entity_tags(:id => 1, :entity_type => 'User', :entity_id => 1, :tag_id => 1)
entity_tags(:id => 2, :entity_type => 'Company', :entity_id => 1, :tag_id => 1)
如此一来,User表中id为1的记录和Company表中id为1的记录都拥有了一个location tag“北京”(假设:tag_type => 1 表示location)
并且,无论怎样添加,tags表中都将为每种tag生成一条唯一的记录,所有的实体和tag关联都保存在entity_tags中,非常易于增删改查。
分享到:
相关推荐
### 基于设计模式构建数据访问中间件 #### 一、引言 随着软件系统的日益复杂化,中间件技术成为提升开发效率、降低维护成本的关键手段之一。尤其是在处理数据访问方面,有效的中间件能够极大地简化开发流程,提高...
《数据结构+算法+设计模式.zip》这个压缩包包含了关于编程领域中三个核心概念的资料:数据结构、算法和设计模式。这些主题是任何软件开发人员的基础,对于提升编程技能和解决问题能力至关重要。 数据结构是计算机...
总结来说,系统概要设计中的数据结构设计是一项复杂而关键的任务,涵盖了从E-R图到关系模型的转换、数据模型的优化、用户子模式设计,以及数据库的物理设计等多个层面。每个步骤都需要深思熟虑,以确保最终设计出的...
这个数据库设计实例涵盖了数据库设计的方方面面,包括实体关系设计、ER 图模型、数据库设计模式、数据表设计、实体之间的关系、数据模型的应用、数据库设计的步骤、数据库设计的原则、数据库设计工具和数据库设计的...
关系实例则提供了实际的数据,这些数据将填充到关系模式定义的表中。例如,教师实例会包含具体教师的工作证号、姓名等信息,而选课表实例则记录学生选修课程的具体情况,如学号、课序号和成绩。 查询描述部分列出了...
《黑马扫地僧C/C++\数据结构\算法\设计模式讲义》是一份全面且深入的编程学习资源,特别适合那些希望通过自学提升C/C++技能的开发者。这份讲义结合了理论与实践,旨在帮助读者掌握编程语言的基础,深化对数据结构的...
Java代码积累:并发 设计模式 数据结构 使用容器 实用 类 基础知识 并发性 演示线程的生命周期 生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者...
高校数据管理信息标准(数据模式)设计说明书是指导高等教育机构进行高效、规范的数据管理和整合的重要文档。这份设计说明书旨在统一各个高校内部的数据管理模式,确保数据的一致性、完整性和可互操作性,从而提高...
数据结构与算法 面向对象的C++设计模式
设计模式可以应用在软件设计的各个方面,包括代码架构、模块交互、数据结构设计等多个层面。 设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。创建型模式主要用于对象的创建过程,结构型模式涉及对象...
MapReduce设计模式是对MapReduce编程范式的进一步深化,通过多种不同的算法和策略来解决数据处理中的常见问题。 本文档中提到了《MapReduce设计模式》这本书,由Donald Miner和Adam Shook所著。书籍的标题说明了其...
关系数据模式设计的整个过程可以分为几个步骤,首先是对问题的提出,即分析业务需求和数据需求,接着是对关系模式的设计,即设计关系模式的结构和约束,最后是对关系模式的优化,即优化关系模式的性能和可扩展性。...
Java 中 MVC 设计模式 MVC 设计模式是软件架构中的一种经典设计模式,广泛应用于 Java Web 开发中。MVC 模式将应用程序分为三个主要部分:Model(模型)、View(视图)和 Controller(控制器),每个部分都有其特定...
本人2021年操作系统-数据结构-Linux-设计模式秋招面试题个人总结,包括死锁、进程线程、linux常用命令、常考数据结构和设计模式等,涵盖大中厂面试题,答案仅供参考。
数据结构与算法——面向对象的C++设计模式
这种设计模式简化了权限管理,提高了系统的灵活性和可扩展性。下面我们将深入探讨基于RBAC的权限管理数据库表的设计。 1. **角色(Role)**: 在RBAC模型中,角色是一组预定义的权限集合。例如,一个"管理员"角色...
简单的课程管理系统数据库设计模式图
java,设计模式,算法,数据结构
《asp.net设计模式》涵盖了开发企业级asp.net应用程序的知名模式和最佳实践。本书用到的模式可以用于从asp.net1.0到asp.net 4.0的任何版本。不必管模式本身所用的语言,可以将模式用于任何面向对象编程语言。 ...