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为目标的数据库