试一试!
数据库和 Web 应用可造就巨大的业务优势。 数据库设计对于实现目标至关重要,无论目标是管理员工信息、提供针对数据的每周报表,还是跟踪客户订单。 花时间了解数据库设计有助于生成首次使用时即可正常运行的数据库,并且它可以适应不断变化的需求。
重要: Access Web 应用与桌面数据库不同。 本文不讨论 Web 应用设计。
概念和术语
我们首先来了解一些基本术语和概念。 要设计有用的数据库,请创建重点针对一个主题的表。 在表中,将该主题所需的所有数据捕获到各字段中,字段包含可能的最小数据单位。
“关系数据库” |
数据库中的数据被划分到表中,这些表类似于电子表格。 每个表仅有一个主题,例如客户(一个表)或产品(另一个表)。 |
“记录和字段” |
用于表中离散数据的存储空间。 行(或记录)存储每个唯一数据点,例如客户姓名。 列(或字段)将捕获到的有关每个数据点的信息分隔成最小单位,例如姓氏占一列、名字占一列。 |
“主键” |
确保每条记录唯一的值。 例如,可能存在两个名为 Elizabeth Andersen 的客户。 但其中一个 Elizabeth Andersen 记录将数字 12 作为其主键,而另一个则将 58 作为主键。 |
“父子级关系” |
表间常见关系。 例如,单个客户可能有多个订单。 父表含有主键。 子表含有外键,外键是来自主键的值,表明子表记录如何链接到父表。 这些键通过关系进行链接。 |
什么是优秀数据库设计?
优秀数据库设计的基础是两个基本原则:
-
“避免重复信息”(也称冗余数据)。 它不仅浪费空间,还增大了出错风险。
-
确保数据正确且完整。 不完整或错误信息在查询和报表中传播,最终可能导致错误决策。
解决这些问题的措施:
-
将数据库信息划分为具有窄焦点的基于主题的表。 避免在多个表中复制信息。 (例如,客户名称应仅位于一个表中。)
-
使用键而非复制数据来联接各表。
-
加入可支持和确保数据库信息准确性和完整性的过程。
-
设计数据库时考虑数据处理和报告需求。
要提高数据库的长期实用性,请遵循以下五个设计步骤:
步骤 1:确定数据库用途
开始之前,设定数据库目标。
要保持设计目标明确,请汇总数据库的用途并时常参考该汇总信息。 例如,如果需要用于家居业务的小型数据库,可编写一些简单语句,如“客户数据库保留客户信息列表,目的在于生成邮件和报表”。 对于企业数据库,可能需要多个段落来说明不同角色的人员何时、以何种方式使用数据库及其数据。 创建具体且详细的任务说明,以便在整个设计过程中参考。
步骤 2:查找和组织所需信息
收集要记录的所有类型的信息,如产品名和订单编号。
从现有信息和跟踪方法入手。 例如,你当前可能在分类帐中记录采购订单,或在纸质表单上保存客户信息。 使用这些源列出当前捕获到的信息(例如表单上的所有框)。 如果当前未捕获到重要信息,请考虑所需的离散信息。 每种数据类型将成为数据库中的一个字段。
无须费心使首个列表完美无瑕,可逐渐对其进行微调。 但请务必考虑到使用此信息的所有人员,并征询其意见。
接下来,考虑要使用数据库实现的效果,以及要生成的报表或邮件类型。 然后,确保捕获到实现这些目标所需的信息。 例如,如果需要按地区显示销售额的报表,则需在地区级别捕获销售数据。 尝试利用实际信息按需草拟报表。 然后,列出创建报表所需的数据。 对邮件或希望从数据库中获得的其他输出执行相同操作。
示例
假定你为客户提供选择加入(或退出)定期电子邮件更新的机会,并且希望打印已选择加入的客户的列表。 需要在“客户”表中创建“发送电子邮件”列,并将其允许值设置为“是”或“否”。
愿意接收电子邮件的客户需提供电子邮件地址,这也需一个字段。 如果希望加入适当的称谓(如先生、太太或女士),请加入“称谓”字段。 如果希望在电子邮件中以客户的名字来称呼对方,请添加“名字”字段。
提示: 请务必将每条信息拆分为其最小有用部分,例如客户表中的名称和姓氏。 通常,如果希望基于信息项(例如客户姓氏)进行排序、搜索、计算或制作报表,应将该项放入其自身字段。
步骤 3:将信息拆分为表
将信息项拆分为主要实体或主题,例如产品、客户和订单。 每个主题成为一个表。
拥有所需信息列表后,确定整理数据所需的主要实体(或主题)。 避免跨实体复制数据。 例如,产品销售数据库的初始列表可能如下所示:
主要实体有:客户、供应商、产品和订单。 因此从这四个表开始:一个用于记录客户资料、一个用于记录供应商资料,以此类推。 这不一定是最终设计,但是个良好的起点。
注意: 优秀的数据库包含多个表。 避免将所有信息放入单个表。 这将导致信息重复、数据库增大和错误增多。 设计为每项资料仅记录一次。 如果发现重复信息(如供应商地址),请重构数据库以将该信息放入单个表。
要了解表越多越好的原因,请查看此处所示的表:
每行均包含产品及其供应商的相关信息。 由于可能有来自同一供应商的多种产品,因此不得不重复多次该供应商的名称和地址信息。 这很浪费磁盘空间。 相反,可以在单独的“供应商”表中仅记录一次该供应商信息,然后将该表链接到“产品”表。
需要修改供应商相关信息时,此设计将显露出其第二个问题。 假定需要更改某供应商的地址。 由于它在多处出现,因此可能出现在某处更改了地址却忘记在其他位置进行更改的意外情况。 仅在一处记录供应商的地址可以解决这个问题。
最后,假定 Coho Winery 仅供应一种产品,而需要删除该产品但保留该供应商的名称和地址信息。 使用这种设计,怎样删除产品记录而不丢失供应商信息? 不可能。 由于每条记录均包含产品资料和供应商资料,因此不可能删除其中一项而保留另一项。 要分隔这些资料,请将此表拆分为两个表:一个用于记录产品信息,另一个用于记录供应商信息。 然后,删除产品记录时仅删除产品资料,而不删除供应商资料。
步骤 4:将信息项转换为列
确定需要存储在每个表中的信息。 这些离散数据片段将成为表中字段。 例如,“员工”表可能包含“姓氏”、“名字”和“雇用日期”等字段。
选定数据库表的主题后,该表中的列应仅存储有关该主题的资料。 例如,“产品”表应仅存储产品资料,而不存储其供应商。
要确定在表中跟踪的信息,请使用之前创建的列表。 例如,“客户”表可能包括以下信息:姓氏、名字、地址、发送电子邮件、称谓和电子邮件地址。 表中的每个记录(客户)包含同一组列,因此可为每位客户存储完全相同的信息。
创建首个列表,然后对其进行检查和优化。 务必将信息细分为尽可能小的字段。 例如,如果初始列表包含“地址”字段,请将其细分为“街道地址”、“城市”、“州/省”和“邮政编码”,如果客户遍布全球,更可将其细分为更多字段。 这样就可以用适当格式发送邮件或按州/省报告订单。
优化每个表中的数据列后,即可选择每个表的主键。
步骤 5:指定主键
选择每个表的主键。 主键(如产品 ID 或订单 ID)唯一标识每条记录。 如果没有明确的唯一标识符,可使用 Access 进行创建。
需设法对每个表中的每一行进行唯一标识。 还记得之前两位客户同名的示例吗? 由于他们同名,因此需设法对其进行分别标识。
因此,每个表应包含可独特标识每一行的一列(或一组列)。 这称为主键,它通常是唯一编号,例如员工 ID 号码或序列号。 Access 使用主键来快速关联和同时呈现多个表中的数据。
有时,主键包含两个或更多字段。 例如,存储订单行项目的“订单明细”表可能在其主键中使用两个列:“订单 ID”和“产品 ID”。 主键采用多个列时,它也称为组合键。
如果已有表中信息的唯一标识符(例如唯一标识目录中每种产品的产品编号),则只要值符合以下主键规则即可将其用作主键:
-
每条记录的标识符都有所不同。 一个主键中不允许存在重复值。
-
项目始终存在对应值。 表中的每条记录必须具有主键。 如果使用多个列来创建该键(如“部件系列”和“部件编号”),则这两个值必须始终存在。
-
主键是不会发生更改的值。 由于其他表引用了这些键,因此在一个表中对主键进行任何更改,都将导致在引用位置对其进行更改。 频繁更改会增加错误风险。
如果没有明确标识符,请使用任意唯一编号作为主键。 例如,可向每个订单分配唯一订单编号,仅用于标识该订单。
提示: 要创建用作主键的唯一编号,请使用“自动编号”数据类型添加列。 “自动编号”数据类型将向每条记录自动分配唯一数值。 这种类型的标识符不包含描述其所代表行的实际信息。 它适合用作主键的原因在于,与包含行相关资料的主键(如电话号码或客户姓名)不同,这些数字不会发生更改。