Database design 哪个数据库表模式更有效?

Database design 哪个数据库表模式更有效?,database-design,Database Design,哪个数据库表模式更有效?为什么 "Users (UserID, UserName, CompamyId)" "Companies (CompamyId, CompanyName)" 或 考虑到用户和公司之间存在一对一的关系,可以肯定的是,考虑到这一限制,较早的一个更有效。为了获得相同的信息,您的查询中的联接数量将减少。这是一个有点开放性的问题,取决于您的业务规则。第一个选项只允许将一个公司映射到一个用户。您正在定义多对一关系 第二个模式定义了多对多关系,允许多个用户映射到多个公司 它们解决不同

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

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


考虑到用户和公司之间存在一对一的关系,可以肯定的是,考虑到这一限制,较早的一个更有效。为了获得相同的信息,您的查询中的联接数量将减少。

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

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

它们解决不同的问题,并根据您试图解决的问题确定您应该使用的模式


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

视情况而定。我个人会选择答案一,因为它会有更少的连接,更容易维护。更少的连接意味着它需要更少的表和索引扫描

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
我认为,当涉及到用户和公司时,你的意思是“多对一”——除非你计划为每个用户建立一个独特的公司


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

这两个模式无法比较,因为它们具有不同的关系,因此您应该仔细查看表的规范,然后确定哪一个适合所需的关系

第一个表示用户只能是一个公司的成员(属于关系)。而第二种模式意味着用户可以是许多公司的成员(a有许多关系)

如果您正在寻找一个能够(或稍后将)支持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__; //选择架构为1的公司x中的所有用户 从公司中选择用户名、公司名称 users.companyid=companys.companyid上的内部加入用户 其中companys.companyid=\uuuu some\u id\uuuuuu; 及

//选择模式为2的公司x中的所有用户 从公司中选择用户名、公司名称 usercompanys.companyid=companys.companyid上的内部加入usercompanys usercompanys.userid=users.userid上的内部加入用户 其中companys.companyid=\uuuu some\u id\uuuuuu;
您在select表上有一个额外的联接。如果您只想要“属于”关系,那么第二个查询所做的工作就比它应该做的要多,从而降低了效率。

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

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

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


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

真的是一对一吗?每个公司只有一个用户,每个用户只属于一个公司?那么您根本不需要companys表,它只是user的一个属性。反之亦然。 //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__;
(ID, UserName, CompanyName)