最近我一直在使用由名为web2py的 Python 网络框架构建的数据库抽象层(点击查看他们的 DAL 语法)。它们包括在语句中包含约束的选项。CREATE TABLE
在采用斯坦福大学的“数据库简介”MOOC时,提到SQL 标准CREATE TABLE
支持语句中的任何查询作为约束(实质上取代了触发器的主要用例)。
什么是最佳实践?
CREATE TABLE
下面是一个在语句中包含约束的简单示例;而不是通过ALERT TABLE
和/或CREATE TRIGGER
语句:
CREATE TABLE Place (
address VARCHAR2(40),
CONSTRAINT place_pk
PRIMARY KEY (address)
);
CREATE TABLE Company (
c_name VARCHAR2(40),
CONSTRAINT company_pk
PRIMARY KEY (c_name)
);
CREATE TABLE Employee (
e_name VARCHAR2(40),
tax_no NUMBER,
salary NUMBER(19,4),
sex CHAR,
birthdate DATE,
address VARCHAR2(40),
CONSTRAINT employee_pk
PRIMARY KEY (tax_no),
CONSTRAINT address_fk
FOREIGN KEY (address) REFERENCES Place(address),
CHECK (address IS NOT NULL)
);
CREATE TABLE CompanyEmployee (
employee_id NUMBER,
company_id VARCHAR2(40),
CONSTRAINT unique_employee_id
UNIQUE(employee_id),
CONSTRAINT employee_id_fk
FOREIGN KEY (employee_id) REFERENCES Employee(tax_no),
CONSTRAINT company_id_fk
FOREIGN KEY (company_id) REFERENCES Company(c_name),
CONSTRAINT company_employees_pk
PRIMARY KEY (employee_id, company_id)
);
顺便说一句:您会注意到我使用 CAPS 作为关键字,大写 CamelCase 用于表名,而小写 under_score 用于属性和触发器名称。这是好习惯吗?- 也可以随意批评我的缩进和空格使用风格:)
我个人认为这是一个品味问题。
通过
ALTER
语句定义约束的脚本更加灵活,因为您不需要关心创建顺序(首先创建所有表,然后创建所有 PK,然后创建所有 FK)。然而,嵌入约束的脚本更加“独立”。您无需在脚本中的其他位置查找约束定义。
使用 camel-case 没有任何区别,因为无论如何所有内容都将转换为大写(因为您没有使用
"
引用您的名字 - 这是一件好事)。关于缩进和空格:这完全是个人喜好。按照你认为在 6 个月内仍然可以理解的方式去做。最重要的是保持一致(并且可能在项目文档的某个地方记录您的风格,以便新成员可以理解和使用相同的格式)
在企业级数据库中,您可以很好地拆分约束,以便更轻松地重新加载大量数据。我见过
每一个都将在一个或多个文件中。所有这些文件都将受到版本控制。
基本原理是加载大量数据然后应用约束比在声明约束和索引后加载大量数据更快。通过在 makefile 中进行一些文本操作,您仍然可以生成包含所有约束的“完整”CREATE TABLE 语句。