Sql 在数据库中组织主键的更好方法是什么?

Sql 在数据库中组织主键的更好方法是什么?,sql,oracle,database-design,primary-key,Sql,Oracle,Database Design,Primary Key,我的数据库有两个表,一个是城市距离矩阵,另一个是城市。我的第一个结构是这样的: 城市 Uuid 名字 纬度 经度 及 距离 FromCityID 托西提德 距离长度 UUID是城市表的主键,FromCityID和ToCityID将每个城市作为外键引用,并且都是距离表的复合主键,因为两个城市之间的距离应该是唯一的 但后来a意识到我不想使用UUID和auto increment作为主键,因为我从保存城市和距离的XML上传数据库中的数据。距离可能不仅包括当前XML中提到的城市,还包括数

我的数据库有两个表,一个是城市距离矩阵,另一个是城市。我的第一个结构是这样的:

  • 城市
    • Uuid
    • 名字
    • 纬度
    • 经度

  • 距离
    • FromCityID
    • 托西提德
    • 距离长度
UUID
是城市表的主键,
FromCityID
ToCityID
将每个城市作为外键引用,并且都是距离表的复合主键,因为两个城市之间的距离应该是唯一的

但后来a意识到我不想使用
UUID
和auto increment作为主键,因为我从保存城市和距离的XML上传数据库中的数据。距离可能不仅包括当前XML中提到的城市,还包括数据库中以前存储的任何城市

我需要一个在数据库和XML中都相同的ID系统。纬度/经度似乎是最好的选择,因此我将表格更改为:

  • 城市
    • 名字
    • 纬度
    • 经度

  • 距离
    • 从城市纬度
    • 从城市的长河
    • tocityidlatude
    • 距离长度
纬度
经度
是城市表的复合主键
FromCityIDLatitude
/
FromCityIDLatitude
ToCityIDLatitude
/
ToCityIDLatitude
将每个城市作为外键引用,并且所有四列都是距离表的复合主键


但使用4列作为主键是一种糟糕的设计。在这种情况下,什么是最好的呢?

我不同意这种说法:

但使用4列作为主键是一种糟糕的设计

一个糟糕的设计是不能满足您的需要,或者允许数据库中出现不一致的情况。在您的情况下,我认为四列主键没有问题,只要我们做一个假设。也就是说,此表的主访问路径将使用主键中的每一列。如果是这样的话,那没关系;我会将整个表放入一个唯一索引中,并在键的四列上放置一个单独的唯一约束

四列索引的问题是当您试图通过第四个叶访问表时。您可能根本不会使用索引。如果有必要定期在第四个叶上进行索引查找,则必须添加另一个索引,等等。最终可能会得到一个索引过度的表


绕过它的方法是错开装载物。不要将XML数据直接加载到主数据库表中。将它们加载到辅助表中,并运行一个进程以查看该城市是否已存在。如果有,就不要添加它。如果没有,则生成一个新的代理密钥,并执行交叉连接以将所有新记录添加到DISTANCE。

我不同意这种说法:

但使用4列作为主键是一种糟糕的设计

一个糟糕的设计是不能满足您的需要,或者允许数据库中出现不一致的情况。在您的情况下,我认为四列主键没有问题,只要我们做一个假设。也就是说,此表的主访问路径将使用主键中的每一列。如果是这样的话,那没关系;我会将整个表放入一个唯一索引中,并在键的四列上放置一个单独的唯一约束

四列索引的问题是当您试图通过第四个叶访问表时。您可能根本不会使用索引。如果有必要定期在第四个叶上进行索引查找,则必须添加另一个索引,等等。最终可能会得到一个索引过度的表

绕过它的方法是错开装载物。不要将XML数据直接加载到主数据库表中。将它们加载到辅助表中,并运行一个进程以查看该城市是否已存在。如果有,就不要添加它。如果没有,则生成一个新的代理键,并执行交叉连接以将所有新记录添加到DISTANCE。

不要忘记表的“物理”设计。对于距离矩阵,考虑使用索引组织表(IOT),并压缩列。

请参见AskTom上关于类似问题(关于距离表)的讨论:

不要忘记桌子的“物理”设计。对于距离矩阵,考虑使用索引组织表(IOT),并压缩列。

请参见AskTom上关于类似问题(关于距离表)的讨论:


要回答您在标题中提出的问题

在数据库中组织主键的更好方法是什么

盲键,无论是整数还是通用唯一标识符,几乎总是更好地作为键。他们永远不需要改变。数据元素可能会更改,也可能不会更改


在您的特殊情况下,城市的纬度和经度不太可能改变。但是,如果您收到一个城市的纬度/经度校正,您现在必须在两个表中进行校正。

要回答您在标题中提出的问题

在数据库中组织主键的更好方法是什么

盲键,无论是整数还是通用唯一标识符,几乎总是更好地作为键。他们永远不需要改变。数据元素可能会更改,也可能不会更改


在您的特殊情况下,城市的纬度和经度不太可能改变。但是,如果您收到一个城市的纬度/经度校正,您现在必须在两个表中进行校正。

谢谢您的建议!“第四片叶子”是什么意思?没问题:-)。在您的例子中,第四片叶子是
tocityidlongite
,第四片叶子是