首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对表6进行规范化

对表6进行规范化
EN

Stack Overflow用户
提问于 2012-10-13 04:53:22
回答 4查看 501关注 0票数 4

我正在建立一个需要规范化的数据库,但我遇到了一个我真的不知道如何处理的问题。

我用我的问题做了一个简单的例子来说明它:

代码语言:javascript
运行
复制
Item ID___Mass___Procurement__Currency__________Amount
0__________2kg___inherited____null________________null
1_________13kg___bought_______US dollars_________47.20  
2__________5kg___bought_______British Pounds______3.10
3_________11kg___inherited____null________________null   
4__________9kg___bought_______US dollars__________1.32

(很抱歉,这个表格很不方便,新用户不能粘贴图片)

在上表中,我有一个属性(Amount),它在功能上依赖于项ID (我认为),但并不是每个项ID都存在(因为继承的项没有货币成本)。我对数据库比较陌生,但我在任何初学者教程或文献中都找不到与此类似的问题。任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-13 05:55:30

不仅仅是Amount,所有的东西都依赖于ItemID,因为这似乎是一个候选关键字。

你的依赖是CurrencyAmountNULL (我猜这意味着未知/无效),当Procurement'inherited' (或者@ this解决方案指出的0成本,正如你提到的“继承的项目没有货币成本”)

换句话说,iems分为两种类型(采购),并且这两种类型中的一种的项目不具有所有属性。

这可以通过超类型/子类型拆分来解决。您有一个超类型表(Item)和两个子类型表(ItemBoughtItemInherited),其中每个子类型表都与超类型表具有1::0..1关系。所有项目的公共属性将位于超类型表中,而其他所有属性将位于尊重的子类型表中:

代码语言:javascript
运行
复制
Item
----------------------------
ItemID    Mass   Procurement
0          2kg   inherited
1         13kg   bought
2          5kg   bought
3         11kg   inherited 
4          9kg   bought

ItemBought
---------------------------------
ItemID    Currency         Amount
1         US dollars       47.20  
2         British Pounds    3.10 
4         US dollars        1.32

ItemInherited
-------------
ItemID
0       
3    

如果没有只有继承项才有的属性,您甚至可以完全跳过ItemInherited表。

有关此模式的其他问题,请查看标签: Class-Table-Inheritance。在此期间,还要查找共享主密钥。对于更简洁的治疗,可以在google上搜索"ER Specialization“。

票数 1
EN

Stack Overflow用户

发布于 2012-10-13 06:55:10

我只需要创建两个新表ItemProcurementCurrencies

如果我没有记错的话,根据提供的数据,金额是项目本身采购的一部分(当项目未被继承时),因此我将在新实体ItemProcurement中对AmountCurrencyID字段进行分组。

如您所见,继承的项在ItemProcurement表中不会有条目。

关于主Item表,如果您期望采购类型只有两个不同的值,那么我将使用一个char(1)列(与B => I不同,继承了=> )。

我看起来像这样:

然后,数据将如下所示:

代码语言:javascript
运行
复制
TABLE Items
+-------+-------+--------------------+
|    ID |  Mass |  ProcurementMethod |
|-------+-------+--------------------+
|     0 |     2 |                  I | 
+-------+-------+--------------------+
|     1 |    13 |                  B | 
+-------+-------+--------------------+
|     2 |     5 |                  B | 
+-------+-------+--------------------+

TABLE ItemProcurement
+--------+-------------+------------+
| ItemID |  CurrencyID |     Amount |
|--------+-------------+------------+
|     1  |         840 |      47.20 | 
+--------+-------------+------------+
|     2  |         826 |       3.10 | 
+--------+-------------+------------+

TABLE Currencies
+------------+---------+-----------------+
| CurrencyID | ISOCode |     Description |
|------------+---------+-----------------+
|        840 |     USD |      US dollars | 
+------------+---------+-----------------+
|        826 |     GBP |  British Pounds | 
+------------+---------+-----------------+
票数 2
EN

Stack Overflow用户

发布于 2012-10-13 05:25:58

这是我的即兴建议:

更新:质量可能是一个浮点数/小数数/双精度数,这取决于你的数据库,成本将是任何处理货币的最佳类型(在SQL Server2008中,它是“钱”,但这些东西是不同的)。

另一个更新:继承项目的成本应该是零,而不是零(事实上,有时会有间接成本,以税收的形式存在,但我离题了。。.)。因此,您的Item Table应该需要一个成本值,即使该成本为零。它不应为空。

如果你有什么问题,请告诉我。。。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12866951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档