在为我之前问的另一个问题创建测试数据库时,我记得可以声明主键 NONCLUSTERED
什么时候使用NONCLUSTERED主键而不是CLUSTERED主键?
提前致谢
我一直在阅读使用或不使用Guid和的原因int。
int更小、更快、更容易记住、保持时间顺序。至于Guid,我发现的唯一优点是它是独一无二的。在哪种情况下 aGuid会更好int,为什么?
从我所看到的,int除了数量限制之外没有任何缺陷,这在许多情况下是无关紧要的。
究竟为什么被Guid创造?我实际上认为它除了用作简单表的主键之外还有其他用途。(任何Guid用于某事的实际应用程序的示例?)
SQL Server 上的 ( Guid = UniqueIdentifier ) 类型
我有几个关于在 PostgreSQL 中使用索引的问题。我有一个Friends带有以下索引的表:
Friends ( user_id1 ,user_id2)
Run Code Online (Sandbox Code Playgroud)
user_id1并且user_id2是user表的外键
这些是等价的吗?如果不是,那为什么?
Index(user_id1,user_id2) and Index(user_id2,user_id1)
Run Code Online (Sandbox Code Playgroud)如果我创建主键(user_id1,user_id2),它会自动为它创建索引吗?
如果第一个问题中的索引不相等,那么在上面的主键命令上创建了哪个索引?
可能的重复:
为什么使用 int 作为查找表的主键?
到目前为止,我习惯于为每个表创建一个 ID 列,它的实用性使我不必考虑有关主键理论的决策。
我大学的教授建议全班从一个或多个字段制作主键,这些字段构成关于每一列的一个唯一信息。是的,我想养成使用自然键而不是代理键的习惯。维基百科上列出了代理键的优缺点,我严格推荐这篇文章
我见过人们对所有内容都使用整数 ID 字段,但没有人评判这种方法,因为
我开始认为额外的 ID 字段只是创建冗余数据而没有实际好处。那么当我可以使用其他列作为关键字段时,为什么还要创建 ID 列呢?

另一方面
额外资源:
我从阅读文章中得出的结论是,我应该尽可能使用自然键,而不是每次都跳过考虑自然键并使用代理键,好像这是一个标准。
我正在使用 Django,但每隔一段时间我就会收到此错误:
IntegrityError:重复键值违反唯一约束“myapp_mymodel_pkey”
详细信息:键(id)=(1)已经存在。
我的 Postgres 数据库实际上有一个主键为 1的myapp_mymodel对象。
为什么 Postgres 会尝试再次使用该主键?或者,这很可能是我的应用程序(或 Django 的 ORM)导致的吗?
刚才这个问题又连续出现了3次。我发现,当它确实发生时,对于给定的表,它会连续发生一次或多次,然后不会再次发生。它似乎在每张桌子完全停止数天之前发生,当它确实发生时每张桌子至少发生一分钟左右,并且只是间歇性地发生(不是所有桌子都立即发生)。
这个错误是如此间歇性的(在 2 周内仅发生 3 次左右 - 数据库上没有其他负载,只是我测试了我的应用程序)这一事实让我对低级问题如此警惕。
我有几个具有相同基本结构的非常大的桌子。每个都有一个RowNumber (bigint)和DataDate (date)列。每晚都使用 SQLBulkImport 加载数据,并且永远不会加载“新”数据 - 它是历史记录(SQL Standard,不是 Enterprise,因此没有分区)。
因为每一位数据都需要绑定回其他系统,并且每个RowNumber/DataDate组合都是唯一的,那就是我的主键。
我注意到,由于我在 SSMS 表设计器中定义 PK 的方式,RowNumber列在第一和DataDate第二位。
我还注意到我的碎片总是非常高~99%。
现在,因为每个DataDate只出现一次,我希望索引器每天只添加到页面,但我想知道它是否实际上是基于RowNumber第一个索引,因此必须改变其他所有内容?
Rownumber不是标识列,它是由外部系统生成的 int(遗憾的是)。它在每个 开始时重置DataDate。
示例数据
RowNumber | DataDate | a | b | c.....
1 |2013-08-01| x | y | z
2 |2013-08-01| x | y | z
...
1 |2013-08-02| x | y | z
2 |2013-08-02| x | y | z
...
Run Code Online (Sandbox Code Playgroud)
数据按RowNumber顺序加载, …
我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。
如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。
table1.ref_field引用第二个表 ( table2.id)的 PK上创建了 FK 约束table1.ref_field这是组织这些索引、主键和外键的最佳方式吗?
我了解代理/人工密钥的一个好处 - 它们不会改变,而且非常方便。无论它们是单场还是多场,都是如此——只要它们是“人造的”。
但是,有时将自动递增的整数字段作为每个表的主键似乎是一个策略问题。拥有这样一个单字段键是否总是最好的主意,为什么(或为什么不)?
需要明确的是,这个问题不是关于人工 vs 自然的——而是关于是否所有人工键都应该是单字段的
我正在设计一个具有多个查找表的数据库,其中包含主要实体的可能属性。我正在考虑使用 4 或 5 个字符的键来标识这些查找值,而不是自动递增的整数,这样当我将这些属性 ID 存储在主表上时,我将看到有意义的值而不仅仅是随机数。
使用字符字段作为主键而不是整数对性能有什么影响?
如果这很重要,我正在使用 MySQL。
[编辑]
这些查找表很少添加新记录。它们是手动维护的,基于字符的密钥也是手动创建的。下面是一个例子:
CUISINES
ID Description
----- --------------
CHNSE Chinese
ITALN Italian
MXICN Mexican
Run Code Online (Sandbox Code Playgroud) primary-key ×10
postgresql ×4
sql-server ×4
index ×2
mysql ×2
constraint ×1
datatypes ×1
derby ×1
foreign-key ×1
performance ×1