哪个数据库表模式更有效,为什么?
"Users (UserID, UserName, CompamyId)"
"Companies (CompamyId, CompanyName)"
或者
"Users (UserID, UserName)"
"Companies (CompamyId, CompanyName)"
"UserCompanies (UserID, CompamyId)"
鉴于用户和公司具有一对一的关系。
哪个数据库表模式更有效,为什么?
"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
这两种模式无法比较,因为它们有不同的关系,你应该看看表的规范是什么,然后找出哪一个适合所需的关系。
第一个暗示用户只能是一家公司的成员( 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 关系,那么第二个查询做的工作比它应该做的要多——因此它的效率会降低。
我认为当涉及到用户和公司时,您的意思是“多对一”——除非您计划为每个用户拥有一家独特的公司。
要回答您的问题,请使用第一种方法。少一张表来存储会减少空间,并使您的查询使用更少的 JOIN 命令。此外,更重要的是,它正确匹配您所需的输入。数据库模式应该描述所有有效数据的格式——如果它符合格式,它应该被认为是有效的。由于用户只能拥有一家公司,因此如果您使用第二种模式,您的数据库中可能会有不正确的数据。
如果 User 和 Company 真的是一对一的关系,那么你只需要一张表:
(ID, UserName, CompanyName)
但我怀疑你的意思是用户和公司之间存在一对多的关系——一个或多个用户公关公司,但只有一个公司公关用户。在这种情况下,两表解决方案是正确的。
如果存在多对多关系(一个公司可以有多个用户,一个用户可以附属于多个公司),那么三表解决方案是正确的。
请注意,效率并不是这里真正的问题。数据的性质决定了您应该使用哪种解决方案。