数据库架构设计

时间:2008-12-24 04:21:46

标签: database database-design schema

我对数据库设计很陌生,对最佳实践有一些疑问,并且非常想学习。 我正在设计一个数据库模式,我对需求有了很好的了解,现在需要将它变成黑白。

在这个伪数据库布局中,我有一个客户表,订单表和产品表。

TBL_PRODUCTS:
ID
说明
细节

TBL_CUSTOMER:
ID
名称
地址

TBL_ORDER:
ID
TBL_CUSTOMER.ID
PROD1
Prod2的
prod3

每个“订单”只有一个客户,但可以包含任意数量的“产品”。

问题是,在我的情况下,给定订单的产品可以是任何数量(单个订单数百个),订单的每个产品需要的不仅仅是“数量”,而是可以有价值跨越特定订单的特定产品的文本页面。 我的问题是,我该如何存储这些信息?

假设我无法将可变长度数组存储为单个字段值,另一个选项是使用以某种方式分隔的字符串并按应用程序中的代码进行拆分。 一个订单可以说100个产品,每个产品只有一个小的int,或5000个字符或自由文本(或介于两者之间的任何东西),仅对该订单唯一。

最重要的是,每个订单都必须拥有自己的审计跟踪,因为在整个生命周期中可能会发生许多事情。 审计跟踪将包含通常的信息 - 用户,时间/日期,操作,可以是任何长度。 我是否会在创建订单时创建特定订单的审计跟踪(因为它们可能会变得非常冗长)?

我有什么地方可以了解更多有关数据库设计技术的内容吗?

6 个答案:

答案 0 :(得分:8)

最常见的方法是将订单商品存储在另一个表格中。

TBL_ORDER:
ID
TBL_CUSTOMER.ID

TBL_ORDER_ITEM:
ID
TBL_ORDER.ID
TBL_PRODUCTS.ID
Quantity
UniqueDetails

同样适用于您的订单审计跟踪。它可以是一个新表,如

TBL_ORDER_AUDIT:
ID
TBL_ORDER.ID
AuditDetails

答案 1 :(得分:4)

首先,谷歌第三范式。在大多数情况下,你的表应该是3NF,但是有些情况下由于性能或易用性而不是这种情况,只有经验才能真正教会你。

你所拥有的是不规范化的。你需要一个“加入表”来实现多对多关系。

<强> TBL_ORDER:
ID
TBL_CUSTOMER.ID

<强> TBL_ORDER_PRODUCT_JOIN:
ID
TBL_ORDER.ID
TBL_Product.ID

<强> TBL_ORDER_AUDIT:
ID
TBL_ORDER.ID
Audit_Details

答案 2 :(得分:2)

订单表中ID列的基本常规名称(复数,因为ORDER是SQL中的关键字)是“订单号”,具有不同的确切拼写(OrderNum,OrderNumber,Order_Num) ,OrderNo,...)。

TBL_前缀是多余的;它是双重多余的,因为它并不总是表格,例如在TBL_ORDER表中使用的TBL_CUSTOMER.ID列名称中。另外,一般来说,尝试使用“。”是个坏主意。在列名称的中间;您必须始终将该名称视为分隔标识符,将其括在双引号(标准SQL和大多数DBMS)或方括号(MS SQL Server;不确定Sybase)中。

Joe Celko对列命名等事情有很多话要说。我不同意他所说的一切,但它很容易被搜索到。另见Fabian Pascal“数据库管理中的实际问题”。

其他答案表明您需要一个“订购商品”表 - 他们是对的;你做。答案还谈到了将数量存储在那里。不要忘记,您需要的不仅仅是数量。例如,您需要订单时的当前价格。在许多系统中,您可能还需要处理折扣,税收和其他详细信息。如果它是一个复杂的项目(如飞机),订单上可能只有一个“项目”,但会有大量的从属细节需要记录。

答案 3 :(得分:2)

虽然不是如何设计数据库模式的参考,但我经常在DatabaseAnswers.org使用模式库。如果你想要一些已经粗糙的东西,这是一个很好的跳跃位置。它们并不完美,很可能需要修改以满足你的需求,但其中有超过500个。

答案 4 :(得分:1)

了解数据库需求分析的实体关系(ER)建模。

了解关系数据库设计以及表的整体逻辑设计的一些关系数据建模。数据规范化是这篇文章的重要组成部分,但绝不是全部都要学习。关系数据库设计在主流DBMS产品中几乎与DBMS无关。

学习物理数据库设计。学习索引设计作为性能设计的第一阶段。某些索引设计与DBMS无关,但随着您的详细信息,物理设计将越来越依赖于DBMS的特殊功能。这可能需要一本专门为您打算使用的DBMS量身定制的书籍。

在设计和构建第一个数据库之前,您不必完成上述所有学习。但你不知道会伤害你。像任何其他技能一样,你做得越多,你就会越好。并且学习其他人已经知道的东西比通过反复试验学习便宜很多。

答案 5 :(得分:-2)

看看使用Rails的敏捷Web开发,它有一个关于ActiveRecord(在Rails中同名设计模式的实现)的优秀部分,并且非常好地解释这些类型的关系,即使你从来没有使用Rails。 Here's也是一个很好的在线教程。