4

哪个数据库表模式更有效,为什么?

"Users (UserID, UserName, CompamyId)"
"Companies (CompamyId, CompanyName)"

或者

"Users (UserID, UserName)"
"Companies (CompamyId, CompanyName)"
"UserCompanies (UserID, CompamyId)"

鉴于用户和公司具有一对一的关系。

4

6 回答 6

7

好吧,这是一个开放式问题,取决于您的业务规则。您拥有的第一个选项只允许将一个公司映射到一个用户。您正在定义多对一关系。

第二个模式定义了一个多对多关系,允许多个用户映射到多个公司。

它们解决了不同的问题,并且取决于您要解决的问题将确定您应该使用什么模式。

严格来说,从“事务”的角度来看,第一个模式会更快,因为您只需提交一行即可将用户对象关联到公司,并检索您的用户工作的公司只需要一次加入,但是,如果您的业务需求发生变化并要求您将多个公司分配给一个用户,则第二种解决方案将更好地扩展。

于 2008-09-02T04:06:47.520 回答
6

可以肯定的是,考虑到这种约束,前一个更有效。为了获得相同的信息,您的查询中的连接数将更少。

于 2008-09-02T04:05:56.213 回答
1

一如既往,这取决于。我个人会选择第一个答案,因为它的连接更少并且更容易维护。更少的连接应该意味着它需要更少的表和索引扫描。

SELECT userid, username, companyid, companyname
FROM companies c, users u
WHERE userid = companyid

比...好多了

SELECT userid, username, companyid, companyname
FROM companies c, users u, usercompanies uc
WHERE u.userid = uc.userid
AND c.companyid = uc.companyid
于 2008-09-02T04:06:59.267 回答
1

这两种模式无法比较,因为它们有不同的关系,你应该看看表的规范是什么,然后找出哪一个适合所需的关系。

第一个暗示用户只能是一家公司的成员 belongs_to 关系)。而第二个模式意味着用户可以是许多公司的成员(has_many 关系)

如果您正在寻找可以(或以后)支持 has_many 关系的模式,那么您希望使用第二个。原因比较:

//选择公司x中具有模式1的所有用户
从公司中选择用户名、公司名
users.companyid = Companies.companyid 上的内部加入用户
其中公司.companyid = __some_id__;

//选择公司x中具有模式2的所有用户
从公司中选择用户名、公司名
在 usercompanies.companyid = Companies.companyid 上内部加入 usercompanies
usercompanies.userid = users.userid 上的内部加入用户
其中公司.companyid = __some_id__;

您在选择表上有一个额外的联接。如果您只想要belongs_to 关系,那么第二个查询做的工作比它应该做的要多——因此它的效率会降低。

于 2008-09-02T04:09:57.857 回答
0

我认为当涉及到用户和公司时,您的意思是“多对一”——除非您计划为每个用户拥有一家独特的公司。

要回答您的问题,请使用第一种方法。少一张表来存储会减少空间,并使您的查询使用更少的 JOIN 命令。此外,更重要的是,它正确匹配您所需的输入。数据库模式应该描述所有有效数据的格式——如果它符合格式,它应该被认为是有效的。由于用户只能拥有一家公司,因此如果您使用第二种模式,您的数据库中可能会有不正确的数据。

于 2008-09-02T04:08:55.237 回答
0

如果 User 和 Company 真的是一对一的关系,那么你只需要一张表:

(ID, UserName, CompanyName)

但我怀疑你的意思是用户和公司之间存在一对多的关系——一个或多个用户公关公司,但只有一个公司公关用户。在这种情况下,两表解决方案是正确的。

如果存在多对多关系(一个公司可以有多个用户,一个用户可以附属于多个公司),那么三表解决方案是正确的。

请注意,效率并不是这里真正的问题。数据的性质决定了您应该使用哪种解决方案。

于 2008-09-17T13:44:01.717 回答