Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 非数字字段作为PK-数据库设计问题_Mysql_Database_Database Design_Rdbms - Fatal编程技术网

Mysql 非数字字段作为PK-数据库设计问题

Mysql 非数字字段作为PK-数据库设计问题,mysql,database,database-design,rdbms,Mysql,Database,Database Design,Rdbms,我有一个utf8格式的国家和城市名称列表。获取任一列表时,它应按输入的顺序返回 例如: Country(country_name|PK) City(city_name|PK, country_name|FK) 国家名称和城市名称不会更改,固定值。然而,订购将是一个问题。为确保保留订单值,请按以下方式输入 Country: UK US Africa 我添加了一个名为sortcountry的新列,该列将显示从1到更高的数值 Country(country_name|PK, sortcountry

我有一个utf8格式的国家和城市名称列表。获取任一列表时,它应按输入的顺序返回

例如:

Country(country_name|PK)
City(city_name|PK, country_name|FK)
国家名称和城市名称不会更改,固定值。然而,订购将是一个问题。为确保保留订单值,请按以下方式输入

Country:
UK
US
Africa
我添加了一个名为sortcountry的新列,该列将显示从1到更高的数值

Country(country_name|PK, sortcountry)
同样的事情也适用于城市表


我认为这是一个比
国家(country\u id,countryname)
更好的解决方案。我做的对吗?

如果排序不遵循任何其他自然规则,那么添加列进行排序是没有问题的

但是,您可能希望主键只包含sortcountry,因为数据将根据其主/聚集索引存储在磁盘上。如果您通常只选择所有国家,那么您希望以正确的顺序从磁盘读取它们

然后在country_name中添加另一个唯一索引,以确保每个名称都是唯一的(就像它是主键一样)并且可以搜索。您不希望以sortcountry作为密钥运行更新。

“我做的对吗?”

绝对不是


任何查询的结果都没有固有的顺序。如果您希望引擎以特定顺序返回查询结果,那么您的工作就是使用order BY子句指定该顺序。

依靠MySQL在磁盘上以PK顺序存储条目是不安全的。选择和订购几百行通常不会引起问题。我将以逻辑的方式构造数据(即,以country_id作为主键,并使用一个单独的排序列)。你可能需要在应用程序的其他地方优化更大的性能问题。我试图避免不必要的内部连接。通过执行我刚才所做的操作,我可以为每个查询获取城市列表,而无需加入。另一种选择是什么?为sortcountry分配PK,然后在sortcountry(FK)旁边添加countryname?这是一个好的替代方案吗?注:假设sortcountry代表国家/地区,按sortcolumn ASC排序。请注意,国家/地区列表不符合顺序。以字母A开头的国家可以在列表中的任何地方。按顺序排序将基于违反现有顺序的字母或字母进行排序。无论如何,我决定删除sortcolumn,因为只要不使用ORDER,提取country_name as就会返回列表。如果你有意见,请随时给我建议。