2017-01-09 137 views
0

我正面临以下问题。关系数据库模型与关系表?

想象一下,一个关系数据库与相关的两个表:

表用户

idUser | email  | otherColumns 
    ------ | ----------- | ------------ 
     1 | [email protected] | .... 

比尔

idBill | value | otherColumns 
    ------ | ------| ------------ 
     1 | 100$ | .... 

建立与添加外公共关系账单表的关键是将每个账单与一个用户相关联。尽管这样,也可以创建一个中间表是这样的:

关系表比尔用户

id  | idUser | idBill 
    ------ | ------ | ------------ 
    1  | 1  | 1 

有了这张表,就可以实现同样的结果,但我认为有一个更好的组织。这个选项是否比其他选项更好?还是取决于上下文?

最后,我想知道是否有任何标准来创建这些关系。

谢谢。

+1

不要将货币存储在值字段中。使该字段成为数字数据类型而不是文本数据类型。只有当你想对该列进行算术运算时,它才会引起你的问题 – RiggsFolly

+1

我每次都是基于关系做它。如果它是1:N我用一个外键使用第一个选项,如果有关系M:N我使用中间表。如果它是关系1:N,我认为没有必要创建下一个表。您必须分配更多空间,并且下一个表对于某人可能难以阅读复杂的数据库设计 – Bulva

回答

3

是的,有标准的 - 或者说,有许多的书籍数据库设计,告诉你接受的智慧。最后一个我记得读到的是“数据库设计和关系理论:正常形式和所有爵士乐”由克里斯托弗J.日期。

您的第一个问题的答案取决于业务领域。它常常有助于总结系统在这样的伪语言:

一个用户由合成主键标识,并且具有 属性XYZ。

A bill是由合成主键标识,有一个值,有 货币,有xyz。

纸币具有正好一个用户

(或)

纸币具有一个或多个用户

(或)

纸币具有正好一个用户和关系具有 属性的x,y和z。

如果帐单只有一个用户,则将“用户”添加为帐单表的外键。没有其他信息需要捕捉。

如果账单可以有多个用户,则创建一个链接/连接表,每个用户/账单组合包含一行。

我的帐单只有一个用户,而且这种关系还有一些其他属性 - 例如,该账单的纳税状态 - 您可以使用任何一种解决方案。就我个人而言,我更愿意创建一个连接表来表明这些属性涉及账单和用户之间的关系,而不是账单本身。但是,其他人有其他意见。

+0

好的回答@NevilleK我会买这本书的。 – Maik

+0

@Maik事实证明,如果一个表等于一系列无损连接,其中公共列为CK(候选键),那么归一化至5NF将永远不会说您应该将该表退回给它们。 (因为该表“满足”“CK所隐含的”连接依赖性“)。这里,Bill_User-plus-user-column表无损地分解为Bill和Bill_User在常见的CK上,因此就是这种情况。答案是“取决于业务领域”是正确的,尽管它在规则方面的理由是模糊的。但这就是书籍的写作原因。 – philipxy

0

我的建议是不要创造另一个表说'关系表比尔映射表账单和客户。它是不是看起来很好用:

添加“ID用户”列在“表草案”,因此你可以很容易地加入billtable和客户表:

表比尔

idBill | value  | otherColumns | iduser 
------ | ------ | ......  | .... 
1   |  100$  |    | 1 
1

这是关于你的设计。可以说根据我们的设计,one用户可以有n账单和one账单必须属于one用户。这意味着我们应该有1-n的关系。将此表示为pyhisical表取决于您拥有哪种类型的关系。对于1-n,我们可以做到这一点,如:

表用户

idUser(PK) | email  | otherColumns 
------  | ------ | ------------ 
1    | [email protected] | .... 

表比尔

idBill(PK) | value  | otherColumns | idUser(FK) 
------  | ------ | ------------ | ------ 
1    |  100$  | ....   | 1 
2    |  10$  | ....   | 1 

TableUser.isUserPKUniqueTableBill.idUser不是PKnot unique的一部分。我更喜欢用这种方式来表示1-n,因为不需要多一个表(在查询中少一个join操作)。

或者你有上面写的,我们可以创建关系表将它们连接:

表用户

idUser(PK) | email  | otherColumns 
------  | ------ | ------------ 
1    | [email protected] | .... 

表比尔

idBill(PK) | value  | otherColumns 
------  | ------ | ------------ 
1    |  100$  | ....   
2    |  10$  | ....   

关系表比尔用户

idUser(FK)  |  idBill(FK) 
------   | ------------ 
1    |  1 
1    |  2 

在关系表中的idUsernot unique原因,我们应该允许重复userid小号(1-n)。 idBill必须是unique因为一张账单必须只有一个所有者。你也可以根据你的设计要求做一些改变,关系是否与identifying有关系。

关系类型:careerride

关于设计问题(ER图):tutorialspoint

ER到表:tutorialcup

+1

ER模型中的关系不是由表之间的外键引用表示的,而是由表中的两个或多个键列的关联表示的。在“Relational Table Bill User”中,“(idUser,idBill)”这对列代表一个ER关系。从“Bill_User.idBill”到“Bill.idBill”的FK约束只是一个完整性约束。此外,您的链接指的是质量差的教程,我建议读者在适当的教育机构网站上查找结果。 – reaanb