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
,第四片叶子是