Database design 正确或错误:好的设计要求每个表都有一个主键,如果没有其他内容,则是一个正在运行的整数

Database design 正确或错误:好的设计要求每个表都有一个主键,如果没有其他内容,则是一个正在运行的整数,database-design,data-warehouse,Database Design,Data Warehouse,考虑一个杂货店场景(我在编这个),其中您有表示销售交易的事实记录,事实表的列包括 SaleItemFact Table ------------------ CustomerID ProductID Price DistributorID DateOfSale Etc Etc Etc 即使在考虑所有键时,表中都有重复,但我认为应该组成一个运行数字键的代理(即标识列),例如整数类型的事务数。 我可以看到有人争辩说事实表可能没有唯一的键(虽然我发明了一个,浪费了4个

考虑一个杂货店场景(我在编这个),其中您有表示销售交易的事实记录,事实表的列包括

SaleItemFact Table
------------------
CustomerID  
ProductID  
Price  
DistributorID  
DateOfSale  
Etc  
Etc  
Etc  

即使在考虑所有键时,表中都有重复,但我认为应该组成一个运行数字键的代理(即标识列),例如整数类型的事务数。


我可以看到有人争辩说事实表可能没有唯一的键(虽然我发明了一个,浪费了4个字节,但是维度表呢?

在许多原因中,每行有一个唯一的键(从数据或其他方面构建)是为了方便对特定行的更新或删除


在任何情况下,这个问题都有点傻,因为这实际上并不涉及工程上的权衡。没有键并没有真正的好处,所以这有什么意义呢?是的,行应该有唯一的标识符。

第一个标准形式要求每个表上都有一个主键。所以这是好的数据所需的最低限度ase设计。主键的选择有很多争议。但数据库设计的第一个标准形式并非如此。

对于数据仓库,事实表通常有一个复合主键,通常是维度表所有外键的组合

事实数据表中没有任何主键也是很常见的,因为它们通常除了浪费空间之外没有其他用途——对于大型数据仓库,空间可能相当大。不过,维度表将有主键


如果您谈论的是杂货店的OLTP部分,您通常会遵循标准的OLTP数据库设计,规范化您的表并提供主键。

正确。从概念上考虑,即使不是由唯一的数据定义的,所有内容都是唯一的。因此,如果您将数据输入到表中,并且它们具有完全相同的信息,则它们是唯一的直到它们被输入两次才变得独一无二


这样,您就可以以相对较低的成本(4字节)轻松地基于id进行选择、更新和删除。可以说,表越大,id越有用。因此,表越大,4字节就越少:-)因为您的问题在数据仓库下:

  • 维度表应该有一个代理(无意义)主键,通常是一个自动递增的整数;以及一个业务键,它唯一地标识表行所描述的对象,如电子邮件地址、全名或类似内容

  • 事实表通常(几乎总是)有一个主键,它是两个或多个外键的组合

将外键组合到主键中时,事实表中不应存在重复项。要测试这一点,只需尝试加载同一事务两次——它应该会失败。自动生成的主键不会阻止此操作,因为它不存在于仓库之外。这个问题通常可以通过将时间戳包含到主键中来解决


有时事实表用作维度,或在视图中用作维度。在这种情况下,可以方便地将一个(大)整数作为主键,而不是几个FK字段——但是,FK和时间戳的原始组合仍应唯一标识事实行

第一种范式是针对娘娘腔的无论如何,我会投你一票,因为这是一个非常好的答案——1:并非所有东西都是独一无二的。请参阅。发生情况的审核表不需要主键。添加一个只会导致失败而不会增加其他价值的索引(具有一定程度的序列化和开销)与良好的设计背道而驰。在这个问题上,不同的供应商可能有更强烈的意见。你的目标是哪一个?在甲骨文中,他们都有;这是ROWID伪列。如果维度是针对
国家
,我建议两个字母的标准代码比自动递增整数更好:
UK
FR
DE
US
RU
,'CZ'。并将其声明为“ascii”,添加时间戳是危险的——有朝一日,您将在同一秒内执行两个操作。否则DST会把一整小时变成一秒钟。