如何使用多个域表创建一个公共组表?

问题描述 投票:0回答:0

场景: 我有多个域表,如客户、商品、位置等......这些域表也可以添加到功能中。

现在我必须创建一个组映射表,我们将使用该表以通用方式在单个表中使用域表数据创建组。 喜欢 ... Customer A , Customer B 和 Customer C ,从客户表中,将构建一个组“SuperCustomerGroup”同样的方式可能是 Location A 和 Location B ,从位置表中,将成为“BestLocationGrop”的成员,就像明智的商品 A 和商品 B ,从商品表中,将构建一个名为“AgriculturalComodityGroup”之类的组。 所有组定义,无论组类型和用于构建组的域数据如何,我都必须保留在一个组映射表中。

有两个IMP点需要记住:

  1. 此域表也可以添加到功能中。
  2. Group 也可以使用子组构建
  3. 组也可以是域间的(比方说,一个名为“someSpecialGroup”的组可以包含“SuperCustomerGroup”和“BestLocationGrop”,如上例所示)

我做了什么:

我设计下表的方式在一定程度上解决了目的,但没有解决完整的问题陈述。

CREATE TABLE COMMODITY (
COMMODITY_ID INTEGER NOT NULL,
COMMODITY_CODE VARCHAR(20) NOT NULL,
COMMODITY_NAME VARCHAR(500),
IMO_FLAG CHAR(1),
UD_FLAG CHAR(1),
CREATED_BY VARCHAR(20) NOT NULL,
CREATED_DT DATE NOT NULL,
LAST_UPDATED_BY VARCHAR(20) NOT NULL,
LAST_UPDATED_TIMESTAMP DATE NOT NULL,
ACTIVE CHAR(1) NOT NULL,
PRIMARY KEY (COMMODITY_ID)
);
CREATE TABLE LOCATION (
LOCATION_ID BIGINT PRIMARY KEY,
LOCATION_NAME VARCHAR(250),
LOCATION_TYPE VARCHAR(100),
PRIORITY INT,
LOCATION_LATITUDE VARCHAR(250),
LOCATION_LONGITUDE VARCHAR(250),
CREATED_BY VARCHAR(20) NOT NULL,
CREATED_DT DATE NOT NULL,
LAST_UPDATED_BY VARCHAR(20) NOT NULL,
LAST_UPDATED_TIMESTAMP DATE NOT NULL
);
CREATE TABLE GROUP_MAPPING (
GROUP_MAPPING_ID SERIAL PRIMARY KEY,
GROUP_ID INT NOT NULL,
ENTITY_TYPE VARCHAR(100) NOT NULL,
ENTITY_ID INT NOT NULL,
CREATED_BY VARCHAR(20) NOT NULL,
CREATED_DT DATE NOT NULL,
LAST_UPDATED_BY VARCHAR(20) NOT NULL,
LAST_UPDATED_TIMESTAMP DATE NOT NULL,
CONSTRAINT FK_GROUP_MAPPING_GROUPS FOREIGN KEY (GROUP_ID) REFERENCES GROUPS (GROUP_ID),
CONSTRAINT FK_GROUP_MAPPING_LOCATIONS FOREIGN KEY (ENTITY_ID) REFERENCES LOCATION (LOCATION_ID) DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT FK_GROUP_MAPPING_COMMODITIES FOREIGN KEY (ENTITY_ID) REFERENCES COMMODITY (COMMODITY_ID) DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT CHK_GROUP_MAPPING_ENTITY_TYPE CHECK (ENTITY_TYPE IN ('Location', 'Commodity'))
);

正如我们所见,“ENTITY_ID”和“ENTITY_TYPE”是本例中域表(在我们的示例商品和位置中)和组表的映射元素。

我还使用组映射表中的此 ENTITY_ID 列与位置表 ID 和商品表 ID 创建 FK 关系。

但问题是,在这种方法中,如果在功能中添加了新的域表,我们必须将该表 PK 添加到该组表中作为 fk,我认为这不是解决它的好方法,因为每次我们都必须更改用于添加新域的 DDL。

任何人都可以在表设计中提出任何更好的方法来解决这个问题。

database postgresql database-design database-administration
© www.soinside.com 2019 - 2024. All rights reserved.