3

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

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

TBL_PRODUCTS:
ID
描述
详细信息

TBL_CUSTOMER:
ID
名称
地址

TBL_ORDER:
ID
TBL_CUSTOMER.ID
prod1
prod2
prod3

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

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

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

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

有什么地方可以让我了解更多关于数据库设计技术的信息吗?

4

6 回答 6

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
于 2008-12-24T04:30:50.863 回答
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

于 2008-12-24T04:30:52.660 回答
2

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

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

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

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

于 2008-12-24T05:30:21.370 回答
2

虽然不是关于如何设计数据库模式的参考,但我经常使用 DatabaseAnswers.org 上的模式。如果您想拥有一些已经粗糙的东西,这是一个很好的起点。它们并不完美,很可能需要修改以满足您的需求,但其中有 500 多个。

于 2008-12-29T14:20:13.730 回答
1

学习用于数据库需求分析的实体关系 (ER) 建模。

学习关系数据库设计和一些关系数据建模,用于表的整体逻辑设计。数据规范化是这篇文章的重要组成部分,但绝不是要学习的全部内容。关系数据库设计在主流 DBMS 产品中几乎是独立于 DBMS 的。

学习物理数据库设计。学习索引设计作为性能设计的第一阶段。一些索引设计是独立于 DBMS 的,但是随着您变得更加详细,物理设计变得越来越依赖于 DBMS 的特殊功能。这可能需要一本专门为您打算使用的 DBMS 量身定制的书。

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

于 2008-12-29T14:01:13.410 回答
-2

看看 Agile Web Development with Rails,它有一个关于 ActiveRecord(Rails 中同名设计模式的实现)的优秀部分,并且很好地解释了这些类型的关系,即使您从未使用过 Rails。这也是一个很好的在线教程。

于 2008-12-24T04:47:38.523 回答