Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无主键vs复合主键_Sql_Database Design - Fatal编程技术网

Sql 无主键vs复合主键

Sql 无主键vs复合主键,sql,database-design,Sql,Database Design,我的方案是有一个表,用于记录和报告用户可以在我们维护的一组站点中更改的一些重要设置(每个站点都有自己的数据库)。在设计表(将部署到每个数据库)时,我不知道是否需要主键。我有一个名为SiteID的列,日志表中的每一行都有SiteID,newVal of Setting,oldVal of Setting,Change date。我将使用它来查看站点上的更改历史,按日期过滤更改等。因此,在这种情况下,显然SiteId本身不能成为PK,但我真的必须添加一个新列,如LogId,以生成一个复合PK吗?我在

我的方案是有一个表,用于记录和报告用户可以在我们维护的一组站点中更改的一些重要设置(每个站点都有自己的数据库)。在设计表(将部署到每个数据库)时,我不知道是否需要
主键。我有一个名为
SiteID
的列,日志表中的每一行都有
SiteID
newVal of Setting
oldVal of Setting
Change date
。我将使用它来查看站点上的更改历史,按日期过滤更改等。因此,在这种情况下,显然
SiteId
本身不能成为
PK
,但我真的必须添加一个新列,如
LogId
,以生成一个复合
P
K吗?我在这里遗漏了什么吗?

我会这样做

{站点ID,版本,设置,更改日期}

由于旧设置可以在以前的版本中找到,所以保留每个版本上的值是可以的

当然,您也可以使用change date作为PK,如下所示:

{SiteId,更改日期,设置,}


如果日期是include time,而您的场景是allow this,那么使用date和siteID会更好。

我会将模式设置为这样

{站点ID,版本,设置,更改日期}

由于旧设置可以在以前的版本中找到,所以保留每个版本上的值是可以的

当然,您也可以使用change date作为PK,如下所示:

{SiteId,更改日期,设置,}


如果日期是include time,并且您的场景是允许,那么使用date和siteID会更好。

没有重复行的表总是至少有一个候选键。我们可以通过
主键
选择一个进行声明;任何其他文件都是通过
唯一的非空文件
。(
UNIQUE NOT NULL
是从
PRIMARY KEY
声明中得到的约束。)如果您不告诉DBMS您的候选键,那么它就不能帮助您,例如,通过防止重复来减少错误,或者通过隐式定义其列上的索引来提高性能

您的问题不清楚如何记录给定新旧值的设置。如果您的列是
siteId
setting
newValue
oldValue
changeDate
,那么您的表有一个候选键,
(siteId,setting,changeDate)
。作为唯一的候选密钥,它是主键。如果设置值标识设置,使您的列为
siteId
newValue
oldValue
changeDate
,则您有两个候选键,
(siteId,newValue,changeDate)
(siteId,oldValue,changeDate)
。每一个都应该获得一个
唯一的NOTNULL
约束。一种是通过主键声明


如果添加另一列unique/subrogate/id值,则该表具有另一个候选键。如前所述,通过
唯一非空
约束约束约束所有这些属性,其中一个可以通过
主键
表示。添加这样一个唯一的/subrogate/id列是有原因的,但这并不是因为没有主键,除非该表有重复的行。

没有重复行的表总是至少有一个候选键。我们可以通过
主键
选择一个进行声明;任何其他文件都是通过
唯一的非空文件
。(
UNIQUE NOT NULL
是从
PRIMARY KEY
声明中得到的约束。)如果您不告诉DBMS您的候选键,那么它就不能帮助您,例如,通过防止重复来减少错误,或者通过隐式定义其列上的索引来提高性能

您的问题不清楚如何记录给定新旧值的设置。如果您的列是
siteId
setting
newValue
oldValue
changeDate
,那么您的表有一个候选键,
(siteId,setting,changeDate)
。作为唯一的候选密钥,它是主键。如果设置值标识设置,使您的列为
siteId
newValue
oldValue
changeDate
,则您有两个候选键,
(siteId,newValue,changeDate)
(siteId,oldValue,changeDate)
。每一个都应该获得一个
唯一的NOTNULL
约束。一种是通过主键声明


如果添加另一列unique/subrogate/id值,则该表具有另一个候选键。如前所述,通过
唯一非空
约束约束约束所有这些属性,其中一个可以通过
主键
表示。添加这样一个唯一的/subrogate/id列是有原因的,但这并不是因为没有主键,除非表中有重复的行。

您需要关注您的用例,主键就像她提到的一样好

如果您确实可以避免数据重复(例如:从应用程序端),并且您知道您的数据,并且知道您需要什么类型的索引等,那么您可以轻松地避免这种情况,主要是在您谈论报告的大规模扫描时,以及在不存在数据重复问题时

在许多MPP数据库(以报告为目标的数据库,如vertica)中,主键是可选的。 所以,底线是,若你们知道你们的数据和用例,那个么你们可以避免的事情中的主键


谢谢。

您需要关注您的用例,主键很好,就像提到她一样

如果您确实可以避免数据重复(例如:从应用程序端),并且您知道您的数据,并且知道您需要什么类型的索引等,那么您可以轻松地避免这种情况,主要是在您谈论报告的大规模扫描时,以及在不存在数据重复问题时

在许多MPP数据库中(以f为目标的数据库