Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Postgresql 数据库设计父子表与多表_Postgresql_Database Design_Multiple Tables_Self Reference - Fatal编程技术网

Postgresql 数据库设计父子表与多表

Postgresql 数据库设计父子表与多表,postgresql,database-design,multiple-tables,self-reference,Postgresql,Database Design,Multiple Tables,Self Reference,我试图为国家元首和城市首脑建立一种亲子关系。我正在考虑两种方法- 1) 创建一个表- pk| name | type | parent 1 | US | country | null 2 | UK | country | null 3 | California | state

我试图为国家元首和城市首脑建立一种亲子关系。我正在考虑两种方法- 1) 创建一个表-

pk| name | type | parent 1 | US | country | null 2 | UK | country | null 3 | California | state | 1 4 | Los Angeles | city | 3 5 | Kent | state | 2 6 | Obama | president | 1 7 | Cameroon | pm | 2 pk |名称|类型|父项 1 |美国|国家|空 2 |英国|国家|空 3 |加利福尼亚|州| 1 4 |洛杉矶|城市| 3 5 |肯特|州| 2 6 |奥巴马|总统| 1 7 |喀麦隆|下午| 2 此表的主键将引用另一个表,该表将记录州/市/国家一段时间内的人口增长

2) 第二种方法是为国家、州、首脑和城市创建多个表格,然后 对关系使用外键引用。 然后每个表(城市/州/国家)的主键将引用人口增长表


方法1比方法2有什么好处吗?查询速度更快吗?

我认为这取决于您还想在数据库中存储什么(如果有的话)。例如,如果您想存储国家特定的数据,例如其他实体的“首都”等,那么我将使用方法2。然而,如果您只需要表示“人口组”,那么1看起来很好,而且更简单。您的父id字段应该是一个外键,即指向同一表上父id的pk。我会考虑为类型表键入外键,这样就可以将它作为一个数字而不是字符串存储在主表中。只要您的密钥被索引,我怀疑您将看到性能上的巨大差异

如果您的结构是刚性的,请使用方法2。它将让你精确地定义引用整数,因此你永远不会有一种情况(比如)一个国家是这个国家的父国(而不是相反)

另一方面,如果您预计动态地添加其他类型的“节点”(例如州下的地区或市镇)和其他类型的关系(例如,一些国家可能根本没有州,因此城市应该直接位于“国家”之下),那么方法1增加的灵活性可能证明了“脆弱性”的合理性引用完整性的定义


如果操作正确,这两种方法在性能方面的表现应该非常相似。

方法1是一个EAV表,几乎总是最糟糕的选择,除非您完全无法提前预测需要哪些字段(例如定义您可能希望从各种医疗测试中存储的所有内容)。对于不易更改的地理数据,我会避免像瘟疫一样的选项1。它更难查询,将成为阻塞争用的来源,通常只是一个坏主意


记住,当以关系方式设计时,关系数据库最有效,不要在定义数据库表时使用面向对象的思想。如果您真的需要EAV功能,至少可以在noSQl数据库中使用,该数据库针对这类功能进行了优化。

一些城市跨越边界。例如,在美国,“德克萨斯州的特萨克纳”是半个城市;“德克萨斯州,阿肯色州”是另一半。就人口而言,它是一个单一的城市(实际上,是一个单一的“大都市统计区”)。出于其他目的,它可能是两个城市。我看到的地址在地理上“在”一个县,“在”第二个县用于紧急服务,“在”第三个县用于非紧急服务。我不想有任何国家/城市的具体数据。我没有太多的类型,所以我相信字符串应该可以。