反模式入门
反模式是一种试图解决问题的方法,但通常会同时引发别的问题。
我们主要分析四种反模式:
逻辑数据库设计反模式
物理数据库设计反模式
查询反模式
应用程序开发的反模式
每个反模式都包含如下的子标题结构
目的 这是你可能要去尝试解决的任务。意图使用反模式提供解决方案,但通常会引起更多问题而告终
反模式 这一部分表述了通常使用的解决方案的本质,并且展示了那些没有预知到的后果,正是这些使得这些方案成为反模式
如何识别反模式 一些固定的方式会有助于你辨识在项目中使用的反模式。你遇到的特殊障碍,或是你自己和别人说的一些话,都能使你提前识别出反模式
合理使用反模式 规则总有例外。在某些情况下,本来认为是反模式的设计却可能是合理的。或者说至少是所有的方案中最合理的
解决方案 这一部分描述了首选的解决方案,它们不仅能够解决原有的问题,同时也不至于引起反模式带来的问题 范例数据库(所有的案例) Accounts(账号)表ddl语句
CREATE TABLE Accounts(
account_id SERIAL PRIMARY KEY ,
account_name VARCHAR(20),
first_name VARCHAR(20),
last_name VARCHAR(20),
email VARCHAR(100),
password_hash CHAR(64),
portrait_image BLOB,
hourly_rate NUMERIC (9,2)
)
BugStatus(Bug状态)表ddl语句
CREATE TABLE BugStatus(
status VARCHAR (20) PRIMARY KEY
)
Bugs(Bug)表ddl语句
CREATE TABLE Bugs(
bug_id SERIAL PRIMARY KEY ,
date_reported DATA NOT NULL ,
summary VARCHAR (80),
description VARCHAR (1000),
resolution VARCHAR (1000),
reported_by BIGINT UNSINGED NOT NULL,
assigned_to BIGINT UNSINGED,
verified_by BIGINT UNSINGED,
status VARCHAR (20) NOT NULL DEFAULT 'NEW',
priority VARCHAR (20),
hours NUMERIC (9,2),
FOREIGN KEY (reported_by) REFERENCES Accounts(account_id),
FOREIGN KEY (assigned_to) REFERENCES Accounts(account_id),
FOREIGN KEY (verified_by) REFERENCES Accounts(account_id),
FOREIGN KEY (status) REFERENCES BugStatus(status)
)
Comments(评论)表ddl语句
CREATE TABLE Comments(
comment_id SERIAL PRIMARY KEY ,
bug_id BIGINT UNSINGED NOT NULL,
author BIGINT UNSINGED NOT NULL,
comment_date DATETIME NOT NULL,
comment TEXT NOT NULL,
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (author) REFERENCES Accounts(account_id)
)
Screenshots(截屏)表ddl语句
CREATE TABLE Screenshots(
bug_id BIGINT UNSINGED NOT NULL,
image_id BIGINT UNSINGED NOT NULL,
screenshot_image BLOB,
caption VARCHAR (100),
PRIMARY KEY (bug_id,image_id),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id)
)
Tags(标签)表ddl语句
CREATE TABLE Tags(
bug_id BIGINT UNSINGED NOT NULL,
tag VARCHAR (20) NOT NULL ,
PRIMARY KEY (bug_id,tag),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id)
)
Products(产品)表ddl语句
CREATE TABLE Products(
product_id SERIAL PRIMARY KEY ,
product_name VARCHAR (50)
)
BugsProducts(产品bug)表ddl语句
CREATE TABLE BugsProducts(
bug_id BIGINT UNSINGED NOT NULL,
product_id BIGINT UNSINGED NOT NULL,
PRIMARY KEY (bug_id,product_id),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id)
)