1

我的问题与数据库模式开发有关,如下所示。

我正在开发一个采购模块,我想在其中购买物品和服务。以下是我的 EER 图,(请注意,服务的专业属性非常少——最多 2 个)

http://i.stack.imgur.com/vzhJz.jpg

我的问题是将产品和服务放在两张桌子上还是只放在一张桌子上?

一个表选项 - 降低复杂性,因为我只需要指定项目 id 引用项目表,该表将具有“item_type”字段来识别它是产品还是服务

两个表选项——必须在我想引用它们的任何地方引用单独的产品或服务,并且必须在每个引用产品或服务的表中保留“item_type”字段?

目前计划使用选项1,但想知道专家对此问题的意见。非常感谢您的时间和建议。谢谢。

4

2 回答 2

0

如果我要实现,我会选择两个表选项,这有点像模式规范化的第一条规则。删除多值属性。不推荐使用 item_type。创建单独的表后,您不需要使用 item_type,您只需使用外键关系即可。

考虑阅读这篇文章: http ://en.wikipedia.org/wiki/Database_normalization

它应该有帮助。

于 2012-12-18T07:40:43.070 回答
0

我当然会选择“两张桌子”选项。您会看到,您必须区分产品和服务,因此您可以switch(item_type) { ... }在程序中使用产品和服务的完全不同的代码路径。如果需要更新数据库模式,switch则更难维护。

第二个原因是 NULL。我建议尽可能避免使用它们——它们产生的问题比解决的问题多。使用两个表,您可以将所有字段声明为非 NULL 并忘记 NULL 处理。使用一个表选项,您必须手动编写代码以确保 if item_type=product,则 Product-specific 字段不为 NULL,并且 Service-specific 字段为,并且 if item_type=service,则 Service-specific 字段不为 NULL,并且 Product-specific 字段是。这不是一件令人愉快的工作,DBMS 无法为您完成(NOT NULL IF another_field = valueSQL 中没有列约束或类似的东西)。

去两张桌子。更容易支持。我曾经看到一个数据库,其中所有内容,每条数据都只放在两个表中 - 有几页和几页代码来确保必要的字段不为 NULL。

于 2012-12-18T07:55:04.733 回答