我应该将美国各州存储在数据库中还是PHP数组中?

11

如何存储美国州名和国家信息?

选项1) 可以创建一个名为states的数据库表,其中包含'id'、'state'和'state_abbr'。然后在用户表中使用'id'引用它。

选项2) 可以创建一个PHP数组,并使用它来填充州名下拉菜单,完全避免查询数据库。该数组的键将是插入到数据库中的值。

由于州名不会改变,因此数据应该是静态的。最佳存储方式是什么?PHP数组是否更快?为什么似乎数据库是存储它的最佳方式呢?

您有什么想法?


我使用 PHP 数组...随便。 - jeremy
2
如果状态也作为数据库中其他记录的一部分保存,则 - 使用适当的引用约束。如果没有,则我认为一种方法比另一种方法没有特别的优势。我不会在这里担心“速度”。如果需要,还有其他机制来处理它。 - user166390
将其存储在数组中可以更快地工作,但使用数据库更加通用,允许轻松导入和导出数据以及对其进行操作。 - Ynhockey
1
如果得克萨斯州决定独立,您的更新策略会是什么样子? - worenga
我倾向于避免使用数据库,如果数据是纯静态的,因为不管你喜不喜欢,数据库总是瓶颈,但正如@pst所指出来的,这取决于您需要这些数据做什么。 - Mahn
我想补充一点,如果这些状态已经在数据库中了,那么它们就可以被其他技术所使用。 - Luc M
3个回答

10

一位聪明的数据库设计师曾告诉我:“你所知道的关于州省代码的一切都是错误的。”

这些是两个字母的代码,而不是缩写。(加利福尼亚州的缩写是“Calif.”,俄亥俄州的缩写是“Ohio”。) 超过50个州和地区都有自己的两个字母代码。 并非所有的两个字母代码都指向州。它们也指向像“密克罗尼西亚联邦”和“帕劳”这样的“领土”。 它们不是唯一的。一个两个字母的代码AE,指代四个不同的军事“州”(欧洲武装部队、加拿大武装部队、中东武装部队和非洲武装部队)。 军事“州”的代码可能会随着部队数量的变化而改变。向非洲派遣几十万名士兵,你很可能会看到武装部队非洲的代码从“AE”变为“AF”。 还有大约十几个领土没有列在这个列表中。其中一些具有战略意义(威克岛、中途岛等),它们的地位很容易发生变化。

考虑到像USPS州代码这样的常见事物,您可能不会知道所有这些内容,将它们存储在表格中更加合理。与PHP数组相比,表格在运行时更易于维护。


你本可以简单地说“把它们存储在表中是有意义的” :) - PHPer

7
因为数据库是存储它的最佳方式。
如果明年你的公司决定走向国际市场,那么你需要国家信息以及一个依赖下拉菜单用于选择不同州/省份的信息。
这意味着你需要添加欧洲、非洲等大量的国家名称和各自对应的州/省份信息。你需要一个庞大的数组来存储这些信息。
之后,你的老板还想要按国家生成报告。
如果你把所有信息都存储在数据库中,这会更加易于管理。

0

我知道这已经过时了,但如果还有其他人想知道同样的事情。我目前正在设计一个应用程序,并为了确保数据完整性,我想创建一个国家和州表。我也有城市,但我想让用户在输入地址时填写。

现在我这么说,是因为我希望我的应用程序最终能够走向国际化。

所以,我当前的国家数据库有249条记录。(我删除了一些没有人口的国家)

另一方面,州有点难处理,因为不是每个国家都称它们为州。(有州、省、部门、教区、领土、地区和可能还有其他的。)但是那张表目前包含3438条记录。

现在我可能会浪费时间研究这些信息,因为可能会有在线数据库可以通过某种API简单地引用,但现在我从一个叫做ISO 3166的东西中获取了我的信息(-1表示国家,-2表示州。(我相信))

所以实际上,我可能永远看不到这些国家的业务,但它们现在存在。

我还创建了一个表格来正确格式化货币值。这也有点困难,因为我只找到了少数所需的信息。

但是当你必须考虑各个国家信息差异时,数据库设计似乎变得有点复杂。

但是最终回答你的问题,如果你仅在美国经营业务,硬编码或使用数据库都可以,但是州会发生变化。虽然我们已经很久没有添加新的州了,但这种情况确实会发生,而且可能很快再次发生。因此,我认为使用数据库更容易管理任何更改。此外,如果您决定显示与州相关的其他信息,您只需要添加一些列,所有引用都将显示该信息。

我的观点是不要在代码中硬编码数据,但我不是专业人士。即使像性别这样您认为永远不会改变的事情,也已经证明它也会随着这些转换术语的出现而发生变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接