kwa*_*wah 5 database-design terminology
我目前不确定现有表类型的正确术语,或者确实不确定我所拥有的示例是否有术语。
我已将我目前对我所知道的类型的理解包含在这个问题中。
问:请提供不同表类型的列表,并附上简短的定义和示例来说明它们。
旁注:上下文是我目前正在尝试将数据库缩减为基本版本(用于测试)。作为此过程的一部分,我希望识别包含要查找的值并且不会更改的表(例如职位和部门名称)与可能被清空的“数据”表,而不会对数据库的其余部分产生不良影响(参见在未定义部门或职位名称的情况下添加工作人员时的参照完整性)。
我相信这是一个表引用第二个表的地方,其中第一个表中的许多行/记录共享相同的字段/列数据。在更简单的情况下,该表可以替换为原始表上的 ENUM 类型。
例如,如果许多用户可以具有相同的职位,则“职位”表被标识为查找表,“用户”表被标识为数据表(见下文):
Users >- Job Title
Run Code Online (Sandbox Code Playgroud)
我相信这是两个表之间发生多对多关系的地方,并且此事务/连接表解决了这种关系。
例如,在许多开发人员可能正在处理许多项目的情况下,“developer_project”表被标识为事务/连接表,并且“Developer”/“Project”表被标识为数据表(见下文)。
Developer -< developer_project >- Project
Run Code Online (Sandbox Code Playgroud)
我几乎是在编造这个表,但是如果一个表能够独立存在,而不管其他表如何,我认为这主要是一个数据存储表,而不是一个结构表。它可以使用查找表作为标准化/优化过程的一部分,但这是偶然的。
我已经看到术语“弱”实体四处流传,它可能/可能不适用于此。我需要进一步阅读才能确定。
例如,“员工”和“建筑物”可以独立于任何其他表而存在,而事务或关系表/实体则不能:
Staff
Building
Run Code Online (Sandbox Code Playgroud)
自引用表自身有一个外键,创建层次结构。
create table employee (
id serial primary key,
name text not null,
supervised_by int null references employee(id)
);
Run Code Online (Sandbox Code Playgroud)
代表具体实体及其抽象。例如,明智的做法是将个人和组织抽象为参与方类型,以便您可以轻松地将其中任何一个添加为销售订单行项目上的客户。
单表继承:
create table party (
id serial primary key,
party_type int not null references party_type(id),
organization_name text null,
individual_first_name text null,
individual_last_name text null
);
Run Code Online (Sandbox Code Playgroud)
类表继承:
create table party (
id serial primary key,
party_type int not null
);
create table organization (
id int primary key references party(id),
name text not null
);
create table individual (
id int primary key references party(id),
first_name text not null,
last_name text not null
);
Run Code Online (Sandbox Code Playgroud)
表示要分析的流程或事件,通常包含维度表的(非强制)键以及一些数字度量。
create table sales_item_fact (
order_id bigint not null,
order_line_item bigint not null,
calendar_key int not null,
customer_key bigint not null,
quantity_sold int not null,
unit_price numeric(19,4) not null
);
Run Code Online (Sandbox Code Playgroud)
描述事实表的维度,通常具有分层属性。例如,您可以将日期分析(分解)为其组成部分,以使查询更容易。
create table calendar (
id int primary key,
date_iso date unique,
year int,
quarter_of_year_int,
month_of_year int,
...
);
Run Code Online (Sandbox Code Playgroud)
存在两种特殊类型的查找表:数字和日期。
数字表只是一条记录,其中包含从 0 到 10,000 的值,通常具有提供不同格式的列(拼写出来的;具有不同区域格式的;罗马数字)。ROW_NUMBER
当您需要独立于、ROWNUM
或 的序列时,可以使用此类表TOP
。
DBA.SO 上探讨了这个概念:为什么数字表“无价”?。
日期表与之类似,在可能的域内每天都有一条记录。列包括单独年份、年份和季度、单独季度、星期几等格式。如果包含布尔字段来标识工作日,则可以使用这样的表来计算两个日期之间的工作日数,例如,或者在一个月内。因此,2013/05 至 2013/06 销售额有所下降;您是否考虑到后者只有 20 个工作日,低于 22 个工作日?另一个有用的选项是列出日历季度和会计季度。
明显的变化包括月份表。如果每小时需要一条记录,则可以将“日期”表连接到“数字”表的第 0 行到第 23 行。
有几个关于这种结构的博客:
http://www.techrepublic.com/blog/datacenter/simplify-sql-server-2005-queries-with-a-dates-table/326