在目前的企业信息系统中,数据库还是最佳的数据存储方式,虽然已经有很多的书籍在指导我们进行数据库设计,但应该那种方式是设计数据库的表结构的最好方法、设计时应遵从什么样的原则、四个范式如何能够用一种方式达到顺畅的应用等是我一直在思考和总结的问题,下文是我针对这几个问题根据自己的设计经历准备总结的一篇文章的提纲,欢迎大家一块进行探讨,集思广益。其中提到了领域建模的概念,但未作详细解释,希望以后能够有时间我们针对这个命题进行深入探讨。
1)不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计;不同组件间所对应的数据库表之间的关联应尽可能减少,如果不同组件间的表需要外键关联也尽量不要创建外键关联,而只是记录关联表的一个主键,确保组件对应的表之间的独立性,为系统或表结构的重构提供可能性。
2)采用领域模型驱动的方式和自顶向下的思路进行数据库设计,首先分析系统业务,根据职责定义对象。对象要符合封装的特性,确保与职责相关的数据项被定义在一个对象之内,这些数据项能够完整描述该职责,不会出现职责描述缺失。并且一个对象有且只有一项职责,如果一个对象要负责两个或两个以上的职责,应进行分拆。
3)根据建立的领域模型进行数据库表的映射,此时应参考数据库设计第二范式:一个表中的所有非关键字属性都依赖于整个关键字。关键字可以是一个属性,也可以是多个属性的集合,不论那种方式,都应确保关键字能够保证唯一性。在确定关键字时,应保证关键字不会参与业务且不会出现更新异常,这时,最优解决方案为采用一个自增数值型属性或一个随机字符串作为表的关键字。
4)由于第一点所述的领域模型驱动的方式设计数据库表结构,领域模型中的每一个对象只有一项职责,所以对象中的数据项不存在传递依赖,所以,这种思路的数据库表结构设计从一开始即满足第三范式:一个表应满足第二范式,且属性间不存在传递依赖。
5)同样,由于对象职责的单一性以及对象之间的关系反映的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N或N-N的角度进一步主对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删除和插入异常。
6)在映射后得出的数据库表结构中,应再根据第四范式进行进一步修改,确保不存在多值依赖。这时,应根据反向工程的思路反馈给领域模型。如果表结构中存在多值依赖,则证明领域模型中的对象具有至少两个以上的职责,应根据第一条进行设计修正。第四范式:一个表如果满足BCNF,不应存在多值依赖。
7)在经过分析后确认所有的表都满足二、三、四范式的情况下,表和表之间的关联尽量采用弱关联以便于对表字段和表结构的调整和重构。并且,我认为数据库中的表是用来持久化一个对象实例在特定时间及特定条件下的状态的,只是一个存储介质,所以,表和表之间也不应用强关联来表述业务(数据间的一致性),这一职责应由系统的逻辑层来保证,这种方式也确保了系统对于不正确数据(脏数据)的兼容性。当然,从整个系统的角度来说我们还是要尽最大努力确保系统不会产生脏数据,单从另一个角度来说,脏数据的产生在一定程度上也是不可避免的,我们也要保证系统对这种情况的容错性。这是一个折中的方案。
8)应针对所有表的主键和外键建立索引,有针对性的(针对一些大数据量和常用检索方式)建立组合属性的索引,提高检索效率。虽然建立索引会消耗部分系统资源,但比较起在检索时搜索整张表中的数据尤其时表中的数据量较大时所带来的性能影响,以及无索引时的排序操作所带来的性能影响,这种方式仍然是值得提倡的。
9)尽量少采用存储过程,目前已经有很多技术可以替代存储过程的功能如“对象/关系映射”等,将数据一致性的保证放在数据库中,无论对于版本控制、开发和部署、以及数据库的迁移都会带来很大的影响。但不可否认,存储过程具有性能上的优势,所以,当系统可使用的硬件不会得到提升而性能又是非常重要的质量属性时,可经过平衡考虑选用存储过程。
10)当处理表间的关联约束所付出的代价(常常是使用性上的代价)超过了保证不会出现修改、删除、更改异常所付出的代价,并且数据冗余也不是主要的问题时,表设计可以不符合四个范式。四个范式确保了不会出现异常,但也可能由此导致过于纯洁的设计,使得表结构难于使用,所以在设计时需要进行综合判断,但首先确保符合四个范式,然后再进行精化修正是刚刚进入数据库设计领域时可以采用的最好办法。
11)设计出的表要具有较好的使用性,主要体现在查询时是否需要关联多张表且还需使用复杂的SQL技巧。
12)设计出的表要尽可能减少数据冗余,确保数据的准确性,有效的控制冗余有助于提高数据库的性能
|
相关推荐
数据库图标的设计通常会遵循一定的设计原则,如一致性、对比度、重复和接近性,以确保用户能快速识别并理解其功能。 总结来说,这个"数据库图标"RAR文件可能是一个包含多种数据库图标设计的资源库,适用于各种IT...
在数据库设计中,有一些约定和规范需要遵循,比如所有的命名应具有描述性,字符集统一为UTF-8,每个数据表的第一个字段为系统内部主键id,日期格式默认为varchar,且大多数字段不允许为空。这些规则有助于保持数据的...
虽然在概要设计中,数据库设计可能不会像详细设计那样深入,但通常会涉及到数据模型的选择、主要数据表的结构和关键字段的定义,以及数据一致性、完整性的保障策略。 5. 性能与安全性设计 这部分简要概述了系统预期...
首先,我们从标题"数据模型设计心得"出发,可以理解这是对数据模型设计经验的分享,可能涵盖了作者在实践中遇到的问题、解决方法以及对数据模型设计原则的理解。数据模型设计通常包括概念数据模型、逻辑数据模型和...
设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...
数据库设计涵盖了管理员表(TAdmin)、留言表(TMessage)等核心表,明确了表之间的关系,例如留言与评论的一对多关系。 在开发过程中,作者建议读者对以下技术有一定的了解: 1. C#语言 2. ASP.NET 3. 设计模式 4...
C#中的类和方法可以被用来封装这些业务逻辑,使得它们可以独立于用户界面和数据存储进行操作。 3. 数据访问层:该层负责与数据库的交互,包括读取、写入、更新和删除数据。在C#中,可以利用ADO.NET库来实现对SQL ...
毕业设计通常要求独立完成,涉及需求分析、设计、编码、测试等完整开发流程,旨在综合运用所学知识,因此这个系统可能涵盖了数据库设计、前端界面、后端服务等多个方面。 【标签】中的“毕设”、“毕业设计”、...
目录 一、前言 4 二、平台总体规划 5 2.1、平台总体设计 5 2.2、系统总体框架 5 2.3、系统设计要求 6 2.4、系统设计原则 7 三、项目概况 8 3.1、项目的核心及开发目的 8 3.2、服务对象 8 3.3、项目开发环境 8 四、...
11. **数据库设计**:数据库可能采用了关系型数据库如SQL Server,包含学生信息、课程安排、成绩管理等多个表,并且设计了合理的ER(实体关系)模型。 12. **软件工程实践**:遵循敏捷开发原则,可能采用Scrum或...
这涉及到UI/UX设计原则,包括按钮布局、颜色搭配、交互反馈等。 6. **设备兼容性**:为了适用于不同类型的房间设备,控制器需要支持多种通信协议,如红外、Wi-Fi、Zigbee等,以适应空调、电视、灯具等的控制需求。 ...
这些案例是C#编程学习的重要资源,因为它们提供了一种实践性的方法来理解面向对象编程、数据库交互、用户界面设计以及系统集成等核心概念。 首先,让我们来看看人事管理系统。在C#中开发人事管理系统涉及到员工信息...
在OA系统中,SQL语句用于创建和操作数据库表,比如创建用户表、角色表、权限表等。项目中附带的SQL语句可能是为了帮助开发者快速搭建数据库环境。 6. **Maven或Gradle构建**:Spring Boot项目通常使用Maven或Gradle...
- **保护声明**:鉴于此资料的重要性和原创性,明确指出任何网站和其他媒体不得转载,确保了知识内容的独特性和版权的安全。 #### 二、书籍特点 - **面向实际需求**:本书直接面向需要学习和提升Protel技能的读者...
- **索引与查询优化**:合理的索引设计和使用可以极大地提升查询速度。例如,在WHERE子句中先使用覆盖范围广的索引列可以减少全表扫描的次数。 ### 8. SQL执行顺序的影响 - **WHERE子句**的顺序:将过滤效果最好的...
"MyAppWeixin"可能会利用SQLite来存储聊天记录和用户信息,开发者可以借此学习如何设计数据库表结构、执行SQL语句,以及使用ContentProvider进行数据共享。 6. **推送服务** 实时的消息推送是微信的一大特点,...
- **主要内容**:研究桥梁健康监测的技术手段和方法。 - **应用前景**:对于保障桥梁结构安全、延长使用寿命具有重要意义。 - **技术要求**:无需特别说明。 #### 二十四、轨道交通安全检测技术研究 - **主要内容**...
性能测试的每一种类型都是针对特定的测试目的和场景设计的。在实际测试过程中,可能需要结合多种测试方法,以全面评估系统的性能,并确保应用系统在各种压力下都能保持稳定和可靠的运行状态。对于性能测试的定义和...
Ruby on Rails,简称Rails,是基于Ruby编程语言的一款开源Web应用程序框架,以其“Convention over Configuration”(约定优于配置)的设计哲学和“Don't Repeat Yourself”(不要重复自己,DRY)的原则著称,极大地...