【数据库】数据库设计之用实体集还是用属性(一)

简介: 数据库设计之用实体集还是用属性(一)

前言


在应用开发完成之后,要改变数据库的物理模式相对地比较简单。但是,由于可能影响到应用程序代码中散布的大量的查询和更新操作,因此改变逻辑模式的任务执行起来常常更加困难。因此,在建立后续的数据库应用之前,慎重实施数据库设计阶段是非常重要的。


数据库在软件项目架构设计中,一般偏向于底层,在分层架构中,数据库之上会有一些数据访问层,会用到jdbc、odbc、mybatis、hibernate、SQLAlchemy、database/sql、gorm……等形形色色的数据访问工具。数据库中一旦模式(schema)发生变化(尤其是修改操作),对上层来说,通常是致命的。在测试领域,测试人员最怕听到的一句话大概就是:“程序改了底层逻辑”。因为这时候,基本意味着以前测过的内容需要重新再测一遍。


我在初次设计平台项目的数据库模式时,一直很纠结数据库表与表之间的关系究竟该怎么判定?实际义务中的一个语义,在数据库建模时,该用实体集还是用属性?


正文


表与表之间的关系?


这个不是本节的重点,不过通过实际项目的实战经验,建议不知道改用一对一、一对多还是多对多关系时,就用多对多关系。因为现在的数据访问层代码基本不会需要程序员去手写多表连接查询之类的复杂 SQL 了,ORM 框架已经包办了,调用简洁明了的接口就可以了。因此为了扩展性,直接选择使用多对多关系就可以了,通过前面,我们已经知道了,应用开发一旦过了初始阶段,几乎就不能改动数据库了。


实体集还是属性?


实体(entity)是现实世界中可区别于其他对象的一个“事物”或“对象”。

实体集(entity set)是相同类型即具有相同性质(或属性)的一个实体集合。

实体通过一组属性来表示。

属性(attribute)是实体集中每个成员所拥有的描述性性质。

实体集还是属性?举个例子说的好理解一点,手机号是应该作为一个人(table_person)表的字段(column_phone_num),还是单拎出来建一种新表(table_phone)与人(table_persion)表建关联关系?


一个人只是记录一下国内的手机号,那就作为属性;在一个人可能希望保存关于电话的额外信息,如它的位置,或类型(移动的、视频的或普通的老式电话),或共享该电话的所有的人时,将电话看做一个实体是一种更好的建模方式。因此,把电话视为一个实体比把它视为一个属性的方式更具通用性;而且当通用性可能有用的时候,这种定义方式就更为适合了。


由此自然而然就产生两个问题:什么构成属性?什么构成实体集?很遗憾,对这两个问并不能简单地回答。区分它们主要依赖于被建模的现实世界中的结构,以及被讨论的属性的相关语义。但通过前面手机号的例子,我们已经明白实际中遇到数据库建模问题时该往什么方向考虑了,这点至关重要!


目录
相关文章
|
7月前
|
存储 缓存 NoSQL
数据库实体与关系模型
【5月更文挑战第16天】本文介绍了数据库模型和UML关系,UML包括依赖、关联(聚合、组合)、泛化和实现4类关系。UML有13种图,分为结构图、行为图和交互图。数据库的基本数据模型包括外模式(用户视图)、概念模式(全局逻辑结构)和内模式(物理存储)。数据模型三要素是数据结构、操作和约束条件。简单易用的缓存数据模型适用于需求灵活、高性能、大数据量且不要求强一致性的场景。
183 5
数据库实体与关系模型
|
7月前
|
NoSQL 数据库
Google Earth Engine(GEE)——美国大陆(CONUS)30米土壤属性概率图数据库
Google Earth Engine(GEE)——美国大陆(CONUS)30米土壤属性概率图数据库
102 0
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
|
7月前
|
NoSQL Java 关系型数据库
基于Java swing和mysql实现酒店管理系统(源码+数据库+运行指导视频+系统用户使用手册+系统PPT+数据库设计说明书+系统概要说明书+需求说明书+详细说明书)
基于Java swing和mysql实现酒店管理系统(源码+数据库+运行指导视频+系统用户使用手册+系统PPT+数据库设计说明书+系统概要说明书+需求说明书+详细说明书)
258 0
|
7月前
|
存储 SQL 数据库
数据库设计案例:电商系统数据库设计实践
数据库设计案例:电商系统数据库设计实践
751 1
|
7月前
|
存储 JSON NoSQL
数据库- 动态属性策略
数据库- 动态属性策略
123 2
|
7月前
|
存储 关系型数据库 数据库
关系型数据库数据库设计
关系型数据库设计是一个综合考虑多个方面的过程。在设计过程中,我们需要遵循一系列原则和实践,以确保数据库能够满足业务需求、保证数据的安全性和一致性,并具备良好的可伸缩性和可扩展性。
124 5
|
3月前
|
前端开发 IDE 数据库连接
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
本文详细介绍了ThinkPHP6中模型层的使用,包括模型属性设置、表映射关系、以及如何在控制层中使用模型层进行CRUD操作。
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
|
4月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
93 0
|
4月前
|
数据管理 数据处理 数据库
数据库中的 ACID 属性详解
【8月更文挑战第31天】
138 0