2012-03-19 73 views
0

我有一个utf8中的国家和城市名称列表。当任一列表被提取时,它应该以它输入的相同顺序返回。非数字字段作为PK - 数据库设计问题

例如:

Country(country_name|PK) 
City(city_name|PK, country_name|FK) 

COUNTRY_NAME和CITY_NAME不会改变,固定值。但是,排序会是一个问题。为了确保我保留作为

Country: 
UK 
US 
Africa 

我添加了一个名为1和高达sortcountry这将数值新列输入的顺序值。

Country(country_name|PK, sortcountry) 

同样的东西适用于城市表。

我觉得这是比country(country_id, countryname)一个更好的解决方案。我做对了吗?

回答

0

如果排序不遵循任何其他自然规则,则添加用于排序的列是没有问题的。

不过,您可能想有一个主键只sortcountry因为数据将根据它的主/聚集索引存储在磁盘上。如果你正常地选择所有国家,那么你会希望他们以正确的顺序从磁盘读取。

然后添加另一个唯一索引COUNTRY_NAME以确保每个名称是唯一的(就像它在那里主键)和搜索。你不想用sortcountry作为你的密钥运行更新。

+1

依靠磁盘上的PK顺序存储MySQL条目是不安全的。选择和订购几百行产品通常不会导致问题。我会逻辑地构造数据(即使用country_id作为PK和单独的排序列)。可能会有更大的性能问题需要在应用程序的其他地方进行优化。 – liquorvicar 2012-03-19 07:24:44

+0

我试图避免不必要的内部连接。通过做我刚刚做的事情,我可以在不需要加入的情况下为每个查询获取城市列表。另一种选择是什么?为sortcountry分配PK,然后在sortcountry(FK)旁边添加countryname?这是一个好的替代解决方案吗?注意:假定sortcountry代表country_id – user311509 2012-03-19 11:25:07

0

“我做对了吗?”

绝对不是。

对于任何查询的结果都没有固有的顺序。如果您希望引擎以特定顺序返回查询结果,则您的工作是使用ORDER BY子句指定该订单。

+0

是的,按sortcolumn ASC排序。请注意,国家/地区列表不正确。以字母A开头的国家可以在列表中的任何地方。做ORDER BY将根据违反现有秩序的字母或左右排序。无论如何,我决定删除sortcolumn,因为只要我不使用ORDER,将country_name作为返回列表。如果您有意见,请随时通知我。 – user311509 2012-03-19 13:19:31