Sql 在数据库表中有主键真的有必要吗?

Sql 在数据库表中有主键真的有必要吗?,sql,database,Sql,Database,我知道这个问题已经被问了很多次,但是请在这个例子中解释一下 所以。。。我有两个表:用户和组 Users(ID, Name...) Groups(ID, UserID[FK], GroupName) 每个用户在Groups表中都可以有多个RecordsGroup 好的,那么为什么我真的需要Groups表中的ID字段呢? 我所做的每一个SQL都是这样的: 此外,用户不能有重复的组,因此表中永远不会有两行 那么,ID字段用于什么 在数据库表中具有主键不是一个要求,但通常是一个好主意。假设您有一百万条

我知道这个问题已经被问了很多次,但是请在这个例子中解释一下

所以。。。我有两个表:用户和组

Users(ID, Name...)
Groups(ID, UserID[FK], GroupName)
每个用户在Groups表中都可以有多个RecordsGroup

好的,那么为什么我真的需要Groups表中的ID字段呢? 我所做的每一个SQL都是这样的:

此外,用户不能有重复的组,因此表中永远不会有两行


那么,ID字段用于什么

在数据库表中具有主键不是一个要求,但通常是一个好主意。假设您有一百万条记录,并希望找到用户ID 532395。如果没有索引,数据库将不得不搜索整个文件,直到找到记录。有了索引,它只需搜索几条记录


在您的例子中,我将按UserID对Groups表进行索引/键控,这样您就可以快速找到给定用户所在的所有组。您可以使用UserID、GroupName或自动递增的行号作为主键

在数据库表中具有主键不是一个要求,但通常是一个好主意。假设您有一百万条记录,并希望找到用户ID 532395。如果没有索引,数据库将不得不搜索整个文件,直到找到记录。有了索引,它只需搜索几条记录


在您的例子中,我将按UserID对Groups表进行索引/键控,这样您就可以快速找到给定用户所在的所有组。您可以使用UserID、GroupName或自动递增的行号作为主键

您不需要使用单个整数列作为主键-您可以将主键定义为UserID和GroupName

为什么要使用主键呢

根据您的DBMS,表中的记录将按主键组织,从而使按该键进行的查找尽可能快。定义主键非常容易。对于所涉及的微小投资,您可以获得性能和可扩展性的大幅提升

几乎所有DBMS都强制主键的唯一性。您说过一个用户不能拥有同一组两次。如果将主键定义为UserID和GroupName,则可以在数据库级别保证该假设始终为真,而无需任何附加代码


您不需要使用单个整数列作为主键-您可以将主键定义为UserID和GroupName

为什么要使用主键呢

根据您的DBMS,表中的记录将按主键组织,从而使按该键进行的查找尽可能快。定义主键非常容易。对于所涉及的微小投资,您可以获得性能和可扩展性的大幅提升

几乎所有DBMS都强制主键的唯一性。您说过一个用户不能拥有同一组两次。如果将主键定义为UserID和GroupName,则可以在数据库级别保证该假设始终为真,而无需任何附加代码


主键通常不是必需的,但通常建议使用主键。如果表上的数据量非常小,主键将不会提高性能,因为每次访问时都会读取整个表。然而,对于大多数小尺寸表,主键将使读取性能更快

对于没有主键或唯一键的表,您可能会遇到一些问题:

如何识别记录。你必须能分辨出一个 记录以运行正确的SQL语句。 如果表中有数百万条记录,请选择要查找的select语句 因为一个特定的记录将永远运行,因为你不是 使用主键。
在用户表中,使用ID作为主键

主键通常不是必需的,但通常建议使用。如果表上的数据量非常小,主键将不会提高性能,因为每次访问时都会读取整个表。然而,对于大多数小尺寸表,主键将使读取性能更快

对于没有主键或唯一键的表,您可能会遇到一些问题:

如何识别记录。你必须能分辨出一个 记录以运行正确的SQL语句。 如果表中有数百万条记录,请选择要查找的select语句 因为一个特定的记录将永远运行,因为你不是 使用主键。
在用户表中,使用ID作为主键

做一件事比做两次要省时

在设计数据库时,不仅要满足当前的需求,还要预测未来的需求。例如,您声明了一项当前要求,即用户不能有重复的组。那很好,但是如果它改变了呢

我自己要三张桌子。组的主键是GroupID,加上GroupName a 这是一个字段,加上我认为合适的任何其他字段。用户将具有类似的结构

我的第三个表是UserGroups。它将有一个复合主键,由UserID、GroupID和一些其他字段组成,这取决于我对当前和未来需求的设想

此外,我发现在所有表中放置CreatedWhen、CreatedBy、LastUpdatedWhen、LastUpdatedBy通常是值得花费时间和精力的

最后,当您这样做时:

SELECT * FROM Groups WHERE UserID = ...
我会这样做:

select JustTheFieldsINeed
from Users join UserGroups using (UserId)
join Groups using (GroupId)
where UserId = something
and other conditions are met.

虽然你的方法一开始需要更少的工作,但如果3年后有人告诉我,用户现在可以属于多个群体,我可以简单地说,是的,先生,3包,然后小睡一会儿。

做一件事比做两次要花更少的时间

在设计数据库时,不仅要满足当前的需求,还要预测未来的需求。例如,您声明了一项当前要求,即用户不能有重复的组。那很好,但是如果它改变了呢

我自己要三张桌子。组将使用GroupID作为主键,加上GroupName作为字段,再加上我认为合适的任何其他字段。用户将具有类似的结构

我的第三个表是UserGroups。它将有一个复合主键,由UserID、GroupID和一些其他字段组成,这取决于我对当前和未来需求的设想

此外,我发现在所有表中放置CreatedWhen、CreatedBy、LastUpdatedWhen、LastUpdatedBy通常是值得花费时间和精力的

最后,当您这样做时:

SELECT * FROM Groups WHERE UserID = ...
我会这样做:

select JustTheFieldsINeed
from Users join UserGroups using (UserId)
join Groups using (GroupId)
where UserId = something
and other conditions are met.

虽然您的方法一开始需要更少的工作,但如果3年后我被告知用户现在可以属于多个组,我可以简单地说,是的,先生,3包,先生,然后小睡一会儿。

主键通常是唯一的。如果您在组表中将UserID设置为primary,那么任何用户都不能有多个组您是正确的-我正在考虑索引并编辑了我的响应。好的,我理解索引部分。也明白主键可以由两个字段组成,但我仍然不明白为什么我需要主键?我可以用UserID字段来区分我的行…如果主键是UserID,GroupName可以防止您有多个相同的条目。主键通常是唯一的。如果您在组表中将UserID设置为primary,那么任何用户都不能有多个组您是正确的-我正在考虑索引并编辑了我的响应。好的,我理解索引部分。也明白主键可以由两个字段组成,但我仍然不明白为什么我需要主键?我可以用UserID字段来区分我的行…有一件事,主键是UserID,GroupName,它可以防止您有多个相同的条目。什么是正常大小的表?什么是正常大小的表?好的,但我仍然没有答案为什么我需要主键?我可以只按UserID索引Groups表而不使用主键吗?好的,但我仍然没有答案为什么我需要主键?我可以只按UserID索引Groups表而不使用主键吗?几乎每个ORM都需要一个主键,所以想想youar数据库将如何使用。几乎每个ORM都需要一个主键,所以想想youar数据库将如何使用。