目录
一、什么是域
谈起域,我们首先应该理解属性的含义。属性是实体或关系的特征或性质,属性是一则相对独立的信息,其值用以识别、描述、评估实体实例。例如:属性'身份证号'可以识别我们的身份,属性'学号'用于描述学生所属院系,属性'销售总额'用于评估交易中的财政收入。
以电子表格为例,电子表格中的列标题就是属性。每个列标题下方一个单元格用来存储相应属性的值。我们可以将电子表格中的列标题、表单中的域、报表中的标签都理解为属性。比如个人名片,名片上的姓名、工作单位、联系方式作为属性。
那么域又如何解释呢,属性域是某一属性所有可能取值的集合。域中往往还包含 一组验证标准,使得域可以被多个属性使用。例如,“日期”域中包括所有的合法日期,它可以应用以下这些属性。
- 员工入职日期
- 订单日期
- 课程开设日期
如果属性与域相关联,那么该属性的取值觉得不允许超出该域,域中的值可以由一组特定的数据列表指定,也可以指定一组规则来约束。例如,’性别‘,取值为’男‘和’女‘的域限定。’员工入职日期‘如果指定规则为’合法日期‘,那么可能取值如下:
- February 30th, 2021
- 2011年8月13日
- 20220101
- 20550827
由于员工入职日期被设定为一个合法日期,故 February 30th, 2021会被排除。再此基础上,限制员工入职日期早于今天,那么20550827也被排除了。如果设置日期格式满足'YYYYMMDD',那么2011年8月13日被排除。此外可以指定入职日期必须在工作日之内,那么对于属性值约束会更加严格。
二、域的分类
(一)格式域
格式域将数据指定为数据库中的标准类型,如整型、字符型、日期型等
(二)列表域
列表域类似于一个下拉列表,它由一个可选的有限值的集合组成,列表域是格式域的精简,如"订单状态"的格式域可以被设置为varchar(10),在此基础上该域可以由(open, shipped, closed, returned)列表域进一步精简。
例如:使用ENUM类型设置列表域
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_status ENUM('open', 'shipped', 'closed', 'returned')
);
(三) 范围域
范围域的设置要求取值介于最小值和最大值之间,例如"工程交付日期"设定为今天到今年年底。与列表域相似,范围域是格式域的进一步精简。
设置范围域可以使用设置属性类型,如INT 指定存储整数范围,DECIMAL 设置小数位数,精确小数范围。 日期/时间类型设置日期格式来满足实际需求。
此外可以使用CHECK约束来设置范围域
CREATE TABLE 表名 (
age int,
name varchar(10),
CONSTRAINT check_age CHECK (age > 18 AND age < 60)
);
三、域的作用
① 插入数据前,通过域的检查来提高数据质量。这是属性域存在的主要原因,通过限定属性的可能取值来降低脏数据进入数据库的可能性。例如,每一个表示金额的属性被设置为“数量域”, 该域要求数字的长度上限为15且包括小数点后的两位,显然这是表示货币数额很好的一种方法,“销售总额”若被设置为“数量域”, 则不允许其他格式的值被添加。
② 数据模型的交流性更强。 当我们在数据模型上设置了域, 就意味着数据模型的一个属性必须具备一个特定域的特征,这样数据模型就变成更容易被理解的交流工具。 例如,我们可以让“销售总额”、“净销售额”、“标价销售额” 3个属性都可以共享同一个“数据域”,进而共享域的特征,他们的取值都被限定为货币。
③ 使得新建模型、维护现有模型变得更有效率。当开始一项新工程时,可以使用一组标准域来节省时间,而无需重新创建。例如,所有与数量有关的属性,都可以同时与数量域关联,这样可以极大节省分析、设计时间。
看到这里,心中否浮现一个问题, 如果我们要做增删改查,既然可以通过设置域的方式来筛选满足要求的元素,相比使用JDBC来筛选数据,这两者方式哪种效率更高呢?
1. 在MySQL中直接写约束:
- 数据一致性: 通过在MySQL中定义约束,可以确保数据的一致性和完整性。MySQL约束可以限制列或表级别的数据输入条件, 例如主键、唯一约束、值非空等。这样,当添加新数据时, MySQL会自动检查并拒绝违反约束条件的操作。
- 性能优化: MySQL的查询优化器可以针对约束条件进行优化,并利用合适的所以来加速查询过程。约束可以帮助数据库有效地执行查询,提高查询性能。
2. 使用JDBC筛选满足要求的元素并添加到数据库:
- 灵活性: 使用JDBC可以根据具体的业务需求编写筛选逻辑, 可以更灵活地进行筛选和处理数据。这种方法适用于一些复杂的筛选逻辑, 需要在JAVA代码层面进行处理的情况。
- 可扩展性: 通过使用JDBC, 可以将筛选逻辑和数据处理集成到应用程序中。这样可以灵活地扩展逻辑和数据流,并根据需求进行定制化处理。
综上所述,如果注重数据一致性和完整性,并且希望通过约束来优化查询性能,那么在MySQL中直接写约束是更好的选择。然而,如果需要灵活地进行筛选和处理数据,并将筛选逻辑集成到应用程序中,那么使用JDBC进行筛选是更适合的方法。
上述内容如果有错误的地方,希望大佬们可以指正。我一直在学习的路上,您的帮助使我收获更大!觉得对您有帮助的话,还请点赞支持!我也会不断更新文章!
参考文献:
数据建模经典教程 : 第二版 Steve Hoberman(著) 人民邮电出版社 2017.6