哪个数据库表架构更有效,为什么?

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

或者

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

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

有帮助吗?

解决方案

当然,考虑到这一限制,较早的方法效率更高。为了获得相同的信息,查询中的联接数量将会减少。

其他提示

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

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

它们解决不同的问题,并且根据您要解决的问题来确定您应该使用什么模式。

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

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

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

这两个模式无法进行比较,因为它们具有不同的关系,您可能应该查看表的规范,然后找出哪一个适合所需的关系。

第一个意味着用户只能是以下组织的成员 公司(属于关系)。而第二个模式意味着用户可以是许多公司的成员(has_many 关系)

如果您正在寻找一种可以(或稍后)支持 has_many 关系的模式,那么您需要选择第二个。原因对比:

//select all users in company x with schema 1
select username, companyname from companies
inner join users on users.companyid = companies.companyid
where companies.companyid = __some_id__;

//select all users in company x with schema 2
select username, companyname from companies
inner join usercompanies on usercompanies.companyid = companies.companyid
inner join users on usercompanies.userid = users.userid
where companies.companyid = __some_id__;

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

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

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

如果用户和公司确实有 一对一 关系,那么你只需要一张表:

(ID, UserName, CompanyName)

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top