开源数据库架构师通常不会在他们的数据库实现业务逻辑。这是许多商业数据库形成鲜明对比,这是一种常见的做法。在第一种情况下,所有的启发式保存在应用程序层和数据库数据质量有很少或没有影响。第二个病例管理所需的规则是由数据库本身,不依赖于软件开发人员充分认识到规则。
现在这一立场在开源世界的一部分,有一个缺乏对业务逻辑的工具在过去的MySQL的宇宙。约束检查,做他们应该做的事仍然是一个最近除了MySQL,发现只有在8.0.16或更高版本,升级的另一个原因。以前的MySQL版本检查语法,但没有约束检查执行所需的工作。但是现在工具存在,也许是时候重新审视传统的立场。PostgreSQL一直有能力做什么你会看到在下面的例子中,和MongoDB在这方面也有一些功能。因此,如果你有能力倾向于您的业务逻辑转移到数据库层。
保持坏数据的数据库是便宜得多的时间和金钱比纠正后依偎在你的表中。您可能已经在使用以下工具来过滤数据。但是你可以有更多的严格的保证你的数据是原始之前就行或文档。
些例子吗?有很多方法来保护你的数据,但是我们将开始与枚举和视图,因为他们已经存在MySQL很长一段时间。
枚举
枚举是一个字符串对象的值从列表中选择允许枚举的值显式地列在表创建时规范。——MySQL手册
枚举的概念是伟大的。设置预定义的值,你想要包含在表,踢出的数据不匹配这些预定义的值,和数据符合你所需要的东西。MongoDB, MySQL和PostgreSQL容纳枚举。在下面的示例中,创建了一个枚举,将只有三个值和排斥其他值,据说。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SQL
&
gt
;
创建
表
enum_example
(
id
int
,
is_good
枚举
(
“是的”
,
“不”
,
“也许”
)
)
;
查询
好吧
,
0
行
影响
(
0.0188
证券交易委员会
)
SQL
&
gt
;
插入
成
enum_example
(
id
,
is_good
)
值
(
1
,
“是的”
)
;
查询
好吧
,
1
行
影响
(
0.0066
证券交易委员会
)
SQL
&
gt
;
插入
成
enum_example
(
id
,
is_good
)
值
(
2
,
“不”
)
;
查询
好吧
,
1
行
影响
(
0.0034
证券交易委员会
)
SQL
&
gt
;
插入
成
enum_example
(
id
,
is_good
)
值
(
3
,
“未知”
)
;
错误
:
1265年
:
数据
截断
为
列
“is_good”
在
行
1
SQL
&
gt
;
显示
警告
;
+
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
水平
|
代码
|
消息
|
+
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
错误
|
1265年
|
数据
截断
为
列
“is_good”
在
行
1
|
+
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
1
行
在
集
(
0.0009
证券交易委员会
)
|
在上面的示例中,所有是好的当我们输入预定义的值,并且,正如所预料的那样,行不一致的数据直接驳回。但当我们试着每个人的最喜欢的值为空的?
|
1
2
3
4
5
6
7
8
9
10
11
|
SQL
&
gt
;
插入
成
enum_example
(
id
,
is_good
)
值
(
3
,
零
)
;
查询
好吧
,
1
行
影响
(
0.0040
证券交易委员会
)
SQL
&
gt
;
SELECT *
从
enum_example
;
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
id
|
is_good
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
1
|
是的
|
|
2
|
没有
|
|
3
|
零
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
3
行
在
集
(
0.0027
证券交易委员会
)
|
见鬼!空不是我们的一个预定义好的价值观,然而这坐,脂肪和快乐,在我们的数据库表。这不同于我们想要的逻辑或数据。这个零问题可以避免通过设置SQL模式严格。
枚举不是非常受欢迎的另一个原因是,他们很难因为枚举排序根据索引号。在上面的例子中,‘是的’将排序第一,没有第二,和“未知”将是第三个。这可能会非常棘手,如果订单对你不好或如果你需要按字母顺序排序的值。
|
1
2
3
4
5
6
7
8
9
|
SQL
&
gt
;
选择
id
,
is_good
从
enum_example
订单
通过
is_good
;
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
id
|
is_good
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
3
|
零
|
|
1
|
是的
|
|
2
|
没有
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
3
行
在
集
(
0.0012
证券交易委员会
)
|
又空NULL的所作所为和排序第一。枚举的概念是相当出色的,但实现可能会导致头痛。这并不意味着你不应该使用它们,但是你必须意识到自己的缺点,让住宿。
的观点
你可能不认为意见作为业务逻辑的领域的一部分,但它们的模糊数据从窥视。视图可以被当作表,您可以定义它们,这样人的权限使用视图是远远低于的创造者的观点。原始表只有限制批准进入的用户,可以建立和视图,以便调用者可以间接获得一些表。
在接下来的例子中,我们有秘密的列的表。不同的权限来限制访问都忽略了。这个表被创建,因此只有选择账户可以看到秘密列。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SQL
&
gt
;
创建
表
secret_stuff
(
id
int
,
秘密
int
)
;
查询
好吧
,
0
行
影响
(
0.0412
证券交易委员会
)
SQL
&
gt
;
插入
成
secret_stuff
(
id
,
秘密
)
值
(
1
,
1
)
,
(
2
,
2
)
;
查询
好吧
,
2
行
影响
(
0.0062
证券交易委员会
)
记录
:
2
重复的
:
0
警告
:
0
SQL
&
gt
;
SELECT *
从
secret_stuff
;
+
- - -
- - -
+
- - -
- - -
- - -
- - -
+
|
id
|
秘密
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
+
|
1
|
1
|
|
2
|
2
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
+
2
行
在
集
(
0.0011
证券交易委员会
)
|
然后创建一个视图。这个视图的用户没有直接访问秘密但可以少其他受保护的数据列在表中。
|
1
2
3
4
5
6
7
8
9
|
SQL
&
gt
;
创建
视图
see_secret
作为
选择
id
,
“XYZ”
从
secret_stuff
;
查询
好吧
,
0
行
影响
(
0.0084
证券交易委员会
)
SQL
&
gt
;
select *
从
see_secret
;
+
- - -
- - -
+
- - -
- - -
- - - - - -
+
|
id
|
XYZ
|
+
- - -
- - -
+
- - -
- - -
- - - - - -
+
|
1
|
XYZ
|
|
2
|
XYZ
|
+
- - -
- - -
+
- - -
- - -
- - - - - -
+
2
行
在
集
(
0.0045
证券交易委员会
)
|
表中的数据直接从看到的秘密列保护,因为他们看不到的名字,更不用说访问,这一列。
视图与数据屏蔽Percona MySQL服务器雷竞技下载官网
一个很酷的功能的raybetapp 屏蔽数据的能力。这种方式,秘密的一部分列是远离的用户视图,比如一个电话号码的最后四个数字或身份证号码。
可以找到更多的细节数据屏蔽Percona MySQL服雷竞技下载官网务器——企业功能在社区的价格。
检查约束
MySQL 8.0.16最后交付工作检查约束。在早期的版本中,他们都被忽略了。MySQL dba,导致不少人咬牙切齿,心,和许多其他的粉丝们其他数据库将理由指出这个问题而做的玩具数据库的笑话。但在过去的几年里,检查约束已经可用,如果未充分利用。
有两种类型的约束,一个广告列一个表。在下一个示例中,约束条件是建立在列b,以确保它有一个值大于1。注意,约束b_gt_1命名和每个模式,您可以使用约束的名字一次。这是强烈建议您名字的约束,让它更容易识别出现问题时。
|
1
2
3
4
5
6
7
|
SQL
&
gt
;
创建
表
cc
(
一个
INT
,
b
INT
约束
b_gt_1
检查
(
b
&
gt
;
1
)
)
;
查询
好吧
,
0
行
影响
(
0.0189
证券交易委员会
)
SQL
&
gt
;
插入
成
cc
(
一个
,
b
)
值
(
1
,
2
)
;
查询
好吧
,
1
行
影响
(
0.0064
证券交易委员会
)
SQL
&
gt
;
插入
成
cc
(
一个
,
b
)
值
(
2
,
0
)
;
错误
:
3819年
:
检查
约束
“b_gt_1”
是
违反了
。
|
在下一个示例中,最后的约束定义在桌子上,两列进行了比较。
|
1
2
3
4
5
6
7
8
|
SQL
&
gt
;
创建
表
cc2
(
一个
INT
,
b
INT
约束
b_gt_2
检查
(
b
&
gt
;
2
)
,
检查
(
一个
&
gt
;
b
)
)
;
查询
好吧
,
0
行
影响
(
0.0216
证券交易委员会
)
SQL
&
gt
;
插入
成
cc2
值
(
1
,
2
)
;
错误
:
3819年
:
检查
约束
“b_gt_2”
是
违反了
。
SQL
&
gt
;
插入
成
cc2
值
(
1
,
3
)
;
错误
:
3819年
:
检查
约束
“cc2_chk_1”
是
违反了
。
|
注意在上面的表约束违反时,服务器分配“cc2_chk_1”这个名字。当约束失败时,弹出错误消息,你被迫寻找不知名的约束,在这种情况下,找到第一个。那么多不知名的约束可以是一个痛苦。
列和表约束可以组合和你愿意让他们那么复杂。
触发器
触发器的使用可以解决很多问题。他们可以执行之前、之后或删除表中的一行,允许数据被保存在另一个表。这是为什么重要?它允许您创建事件周围的变化数据。也许当客户删除账户,你想将他们的电子邮件地址添加到“不批量电子邮件”表,离开另一个表中的记录的时间戳,并检查在任何订单正在处理。
下面的例子是当客户代表改变的审计跟踪客户故障单帐户。出于某种原因,管理层希望看到当前客户代表更改的频率。出于清晰、时间戳列在下面的表中省略了。
第一个表是麻烦门票。
|
1
2
|
SQL
&
gt
;
创建
表
票
(
id
int
,
客户
int
,
rep_current
字符
(
10
)
;
查询
好吧
,
0
行
影响
(
0.0205
证券交易委员会
)
|
下表是更改的日志在那些麻烦门票。
|
1
2
|
SQL
&
gt
;
创建
表
ticket_log
(
id
int
,
客户
int
,
代表
字符
(
10
)
)
;
查询
好吧
,
0
行
影响
(
0.0156
证券交易委员会
)
|
现在一个触发器设置这样的变化票表存储在ticket_log表。
|
1
2
3
4
5
6
7
|
SQL
&
gt
;
分隔符
美元
美元
SQL
&
gt
;
创建
触发
ticket_change
后
更新
在
票
为
每一个
行
- - - - - -
&
gt
;
开始
- - - - - -
&
gt
;
插入
成
ticket_log
值
(
老
。
id
,
老
。
客户
,
新
。
rep_current
)
;
- - - - - -
&
gt
;
结束
美元
美元
查询
好吧
,
0
行
影响
(
0.0088
证券交易委员会
)
SQL
&
gt
;
分隔符
;
|
|
1
2
3
4
5
6
7
8
9
10
11
|
SQL
&
gt
;
更新
票
集
rep_current
=
“玛丽”
在哪里
id
=
10
;
查询
好吧
,
1
行
影响
(
0.0034
证券交易委员会
)
行
匹配
:
1
改变了
:
1
警告
:
0
SQL
&
gt
;
select *
从
ticket_log
;
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
id
|
客户
|
代表
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
|
10
|
234年
|
玛丽
|
+
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
1
行
在
集
(
0.0009
证券交易委员会
)
|
根据你的数据库,你可以有多个触发器表,指定的顺序执行,并定义帐户使用触发器,当你需要额外的数据安全。逻辑检查的例子,可以在这个层次上实现客户信用额度,最低订购量的限制政策,存货的订货数量检查让业务一路高歌。
遗憾的是对于MongoDB用户来说,触发器只是Atlas平台上可用。
存储过程
PostgreSQL的支持存储过程,而MongoDB有一个的,相当于,和MySQL最小的支持。存储过程可以比特别安全查询,有时可以减少网络流量,并能保持集中在数据库服务器上的代码。
我们想要代码或数据库的智慧吗?
结论
如前所述,大多数开源数据库从业者保持代码的业务逻辑。这是一个实用和合理的方法只要所有那些做编码理解规则,妥善实施这些规则。但是随着人员的增加,知识的传播可能无法正确传递。代价高昂的错误,无意中违反法律,和行转换为无用的胡言乱语,当这一切发生的时候。
把数据库中的业务逻辑在很多地方是有道理的。如果你只销售产品,对成年人来说,你需要检查客户的年龄。促销细节像有免运费的最低订购量值是50美元或订购十个或更多和15%的折扣很容易实现。你有足够的存货立即船,或者你需要提供从供应商的仓库估计交货日期吗?这种逻辑不是分散到多个应用程序,而是保存在数据库级防火墙,仲裁员,唯一的参考。
在现代世界中,数据库的数量如雨后春笋般出现,数量和增长速度的唯一的事就是项目使用这些数据库,执行业务规则和逻辑能力依靠不断扩大代码库是不实际的。问自己如果应用程序代码更改由邮政运费的增加你的操作是通过搜索大量的代码库,最好更新程序和部署新代码缺少一些高概率的应用程序或在数据库级别上做出一个改变。
现在是时候开始看您的系统上面看到,你可以使用一些技术来开始你的一些业务逻辑数据库。会有情况数据库做这项工作是显而易见的解决方案和唯一实现的业务逻辑。
雷竞技下载官网Percona MySQL是最完整,分布稳定、可伸缩的、安全的MySQL开源解决方案,提供企业级的数据库环境最关键业务应用程序…和它的免费使用!





