像普通书籍一样,本系列博客也有引子,它将笼统介绍本系列博客内容。

本博客,是因为我读到一本《SQL反模式》的书,发现它介绍了日常开发中我经常遇到的问题,受益匪浅,所以决定写下博客,画出本书的重点,以及尽可能的将书中sql语句翻译成mysql,一来帮我记忆,二来分享和大家一起学习

什么是“反模式”

    本书介绍到的“反模式”,定义为:“反模式是一种试图解决需求的“不合常规”方法。”
    注意:是试图,指我们在遇到需求时,想到某个“不合常规”的解决办法,引发的系列问题,但不是说这样的解决办法不好,我们要合理使用

反模式分类

  1. 逻辑数据库设计反模式
  2. 物理数据库设计反模式
  3. 查询反模式
  4. 应用程序开发反模式

本书每章结构,我也尽量按照这个结构记录

  • 目的
        这是你可能要去尝试解决的任务。意图使用反模式提供解决方案,但通常会以引起更多问题而告终。
  • 反模式
        这一部分表述了通常使用的解决方案的本质,并且展示了那些没有预知到的后果,正是这些使得这些方案成为反模式。
  • 如何识别反模式
        一些固定的方式会有助于你辨识在项目中使用的反模式。你遇到的特殊障碍,或是你自己和别人说的一些话,都能使你提前识别出反模式。
  • 合理使用反模式
        规则总有例外。在某些情况下,本来认为是反模式的设计却可能是合理的,或者说至少是所有的方案中最合理的。
  • 解决办法
        描述了首选的最佳解决方案,他们不仅能够解决原有的问题,同时也不至于引起由反模式导致的新问题。

示例数据库

    以下sql跟书中不一致,我修改有些命名规则,如下。
    我不喜欢表名存在复数,因为这样会让我生成java类也是复数。
    我不喜欢表名用驼峰的规则,这貌似也不符合sql的规范。
    这两点出现在书中,感觉有点怪,也可能是我认知错了

DDL语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
create table account(
account_id SERIAL PRIMARY KEY,
account_name VARCHAR(20),
first_name VARCHAR(20),
last_name VARCHAR(20),
email VARCHAR(1000),
password_hash VARCHAR(64),
protrait_image BLOB,
hourly_rate NUMERIC(9,2)
);

create table bug_stastus(
status VARCHAR(20) PRIMARY KEY
);

create table bug(
bug_id SERIAL PRIMARY KEY,
date_reported DATE NOT NULL,
summary VARCHAR(80),
description VARCHAR(1000),
resolution VARCHAR(1000),
reported_by BIGINT UNSIGNED NOT NULL,
assigned_to BIGINT UNSIGNED,
verified_by BIGINT UNSIGNED,
status VARCHAR(20) NOT NULL DEFAULT 'NEW',
priority VARCHAR(20),
hours NUMERIC(9,2),
FOREIGN KEY (reported_by) REFERENCES account(account_id),
FOREIGN KEY (assigned_to) REFERENCES account(account_id),
FOREIGN KEY (verified_by) REFERENCES account(account_id),
FOREIGN KEY (status) REFERENCES bug_stastus(status)
);

create table comments(
comment_id SERIAL PRIMARY KEY,
bug_id BIGINT UNSIGNED NOT NULL,
author BIGINT UNSIGNED NOT NULL,
comment_date DATETIME NOT NULL,
comment TEXT NOT NULL,
FOREIGN KEY (bug_id) REFERENCES bug(bug_id),
FOREIGN KEY (author) REFERENCES account(account_id)
);

create table screenshot(
bug_id BIGINT UNSIGNED NOT NULL,
image_id BIGINT UNSIGNED NOT NULL,
screenshot_image BLOB,
caption VARCHAR(100),
PRIMARY KEY (bug_id,image_id),
FOREIGN KEY (bug_id) REFERENCES bug(bug_id)
);

create table tag(
bug_id BIGINT UNSIGNED NOT NULL,
tag VARCHAR(20) NOT NULL,
PRIMARY KEY (bug_id,tag),
FOREIGN KEY (bug_id) REFERENCES bug(bug_id)
);

create table product(
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(50)
);

create table bug_product(
bug_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (bug_id,product_id),
FOREIGN KEY (bug_id) REFERENCES bug(bug_id),
FOREIGN KEY (product_id) REFERENCES product(product_id)
);
ERD图

ERD图