statistics
- statistics_2010_04 (inherits statistics)
- statistics_2010_05 (inherits statistics)
fillfactor
的默认值是 100,来源于 http://www.postgresql.org/docs/9.1/static/sql-createtable.html:
fillfactor
是一个在10到100之间的百分比,用于表格。100(完全填充)是默认值。
"表继承"与"类继承"的含义不同,它们有不同的用途。
Postgres非常关注数据定义。有时是非常复杂的数据定义。OOP(以普及的Java背景为例)是关于将行为从单个原子结构中屈服于数据定义。这里“继承”的目的和意义显著不同。
在OOP领域,我可能会这样定义(在此处语法和语义上非常宽泛):
import life
class Animal(life.Autonomous):
metabolism = biofunc(alive=True)
def die(self):
self.metabolism = False
class Mammal(Animal):
hair_color = color(foo=bar)
def gray(self, mate):
self.hair_color = age_effect('hair', self.age)
class Human(Mammal):
alcoholic = vice_boolean(baz=balls)
这可能看起来像是表格:
CREATE TABLE animal
(name varchar(20) PRIMARY KEY,
metabolism boolean NOT NULL);
CREATE TABLE mammal
(hair_color varchar(20) REFERENCES hair_color(code) NOT NULL,
PRIMARY KEY (name))
INHERITS (animal);
CREATE TABLE human
(alcoholic boolean NOT NULL,
FOREIGN KEY (hair_color) REFERENCES hair_color(code),
PRIMARY KEY (name))
INHERITS (mammal);
但是行为呢?它们没有合适的位置。这不是数据库世界中所讨论的“对象”的目的,因为数据库关注的是数据,而不是过程性代码。您可以在数据库中编写函数来执行计算(通常是一个非常好的主意,但不是适合这种情况的东西),但函数并不等同于方法——在你谈论的面向对象编程中,方法是故意设计得不太灵活。
还有一件事需要指出,作为一个示意工具,继承有一个特点:截至Postgres 9.2,没有办法跨所有分区/表族成员引用外键约束。您可以编写检查来解决此问题或另寻他路,但这不是一个内置功能(实际上涉及到复杂索引问题,没有人编写必要的部分以使其自动化)。在数据库中,与表的对象继承匹配度更高的是将原理扩展到表中。就像这样:
CREATE TABLE animal
(name varchar(20) PRIMARY KEY,
ilk varchar(20) REFERENCES animal_ilk NOT NULL,
metabolism boolean NOT NULL);
CREATE TABLE mammal
(animal varchar(20) REFERENCES animal PRIMARY KEY,
ilk varchar(20) REFERENCES mammal_ilk NOT NULL,
hair_color varchar(20) REFERENCES hair_color(code) NOT NULL);
CREATE TABLE human
(mammal varchar(20) REFERENCES mammal PRIMARY KEY,
alcoholic boolean NOT NULL);
现在我们有了一个规范的动物实例引用,可以可靠地用作外键引用,我们还有一个“ilk”列,引用了一个 xxx_ilk 定义表,该表指向扩展数据的“下一个”表(如果 ilk 是通用类型本身,则指示没有)。针对这种模式编写表函数、视图等非常容易,大多数 ORM 框架在您采用面向对象编程(OOP)类继承来创建对象类型族时,都会在后台执行这种操作。
ONLY
即可。我对继承表的唯一经验是在分区方面。它可以正常工作,但它不是PostgreSQL中最复杂和易于使用的部分。
上周我们遇到了同样的OOP问题,但我们在Hibernate方面遇到了太多问题 - 我们不喜欢我们的设置,所以我们没有在PostgreSQL中使用继承。
当我需要在表之间有多对一的关系时,我使用继承。
例如:假设您想要存储带有属性x、y、旋转和比例的对象地图位置。
现在假设您有几种不同类型的对象要显示在地图上,并且每个对象都有自己的地图位置参数,并且地图参数永远不会被重用。
在这些情况下,表继承将非常有用,以避免维护不规范的表或创建位置id并将其交叉引用到其他表中。
我尝试了一些操作,不会指出数据库继承是否有任何实际用例,但会为您提供一些详细信息以做出决策。以下是PostgresQL的示例:https://www.postgresql.org/docs/15/tutorial-inheritance.html 您可以尝试下面的SQL脚本。
CREATE TABLE IF NOT EXISTS cities (
name text,
population real,
elevation int -- (in ft)
);
CREATE TABLE IF NOT EXISTS capitals (
state char(2) UNIQUE NOT NULL
) INHERITS (cities);
ALTER TABLE cities
ADD test_id varchar(255); -- Both table would contains test col
DROP TABLE cities; -- Cannot drop because capitals depends on it
ALTER TABLE cities
ADD CONSTRAINT fk_test FOREIGN KEY (test_id) REFERENCES sometable (id);
根据我的评论,让我总结一下:
从我的角度来看,在不断发展的应用程序中,我们很难预测未来的变化,对于我来说,我会避免将其应用于早期数据库开发。
当功能稳定并且我们想要创建与现有模型非常相似的数据库模型时,我们可以考虑使用该用例。
尽可能少地使用它。通常意义上,这意味着永远不要使用,因为它会导致创建违反关系模型的结构方式,例如通过打破信息原则并创建包而不是关系。
相反,使用表划分与适当的关系建模,包括进一步的规范化形式。