PostgreSQL表的继承和约束

时间:2017-03-24 09:30:27

标签: postgresql single-table-inheritance

我有一些类似于以下表的DDL:

CREATE TABLE devices
(
  device_uuid            uuid NOT NULL,
  manufacturer_uuid       NOT NULL,
  ...
  CONSTRAINT device_manufacturer_uuid_fkey FOREIGN_KEY (manufacturer_uuid)
      REFERENCES manufacturer (manufacturer_uuid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT devices_device_uuid_key UNIQUE (device_uuid),
  CONSTRAINT devices_pkey PRIMARY KEY (device_uuid)
);

我可能有不同类型的devices,例如"外围设备","电源","图形"等

我可以采取两种方法:

  1. 在此表中添加一个简单的type

    • 优点:我有一个非常简单的数据库结构。

    • 缺点:可能会有数十万个条目,这可能会导致性能问题。 "设备列表"将定期搜索,并搜索所有这些条目,以找到类型"外围设备"每次都可能不是很好。

  2. 从上表中为每种类型继承。

  3. 这个DDL看起来类似于以下(我相信):

    CREATE TABLE devicesperipherals 
    (
      type                       device NOT NULL,
      CONSTRAINT devicesperipherals_manufacturer_uuid_fkey FOREIGN_KEY (manufacturer_uuid)
          REFERENCES manufacturer (manufacturer_uuid) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION,
      CONSTRAINT devicesperipherals_device_uuid_key UNIQUE (device_uuid)
      CONSTRAINT devices_manufacturer_uuid_fkey FOREIGN_KEY (manufacturer_uuid)
          REFERENCES manufacturer (manufacturer_uuid) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION, 
    )
    INHERITS (devices)
    WITH (
      OIDS=FALSE
    );
    
    • 优点:根据我对表继承的了解,这种方法应该有更好的性能。

    • 缺点:数据库结构更复杂,索引需要更多空间。

    在这种情况下,哪种方法首选?为什么呢?

0 个答案:

没有答案