[英]How to normalize three identical tables into one table?
我有三個表:
類別 1:
id(PK)
name
description
類別 2:
id(PK)
name
description
cat1_id1(FK)
三類
id(PK)
name
description
cat2_id(FK)
cat1 有一對多的 cat2,cat2 有一對多的 cat3。
如何將三張表歸一化為一張表?
比如這個設計:
CREATE TABLE IF NOT EXISTS public."animalGroups_animalgroup"
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ,
name text
description text COLLATE pg_catalog."default" NOT NULL,
images character varying(100) COLLATE pg_catalog."default" NOT NULL,
)
CREATE TABLE IF NOT EXISTS public.category_category
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ,
name character varying(100) COLLATE pg_catalog."default" NOT NULL,
description text COLLATE pg_catalog."default" NOT NULL,
images character varying(100) COLLATE pg_catalog."default" NOT NULL,
animalgroup_id(FK)
)
CREATE TABLE IF NOT EXISTS public.subcategory_subcategory
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ,
name character varying(100) COLLATE pg_catalog."default" NOT NULL,
description text COLLATE pg_catalog."default" NOT NULL,
images character varying(100) COLLATE pg_catalog."default" NOT NULL,
category_id(FK)
)
CREATE TABLE IF NOT EXISTS public.animal_animal
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ,
name character varying(100) COLLATE pg_catalog."default" NOT NULL,
description text COLLATE pg_catalog."default" NOT NULL,
images character varying(100) COLLATE pg_catalog."default" NOT NULL,
subcategory_id(FK)
)
它會是什么樣子:
這個設計正確嗎?
他們有四個相同的領域。 要再添加一個字段,例如年齡,那么我必須在所有四個表中添加字段年齡。
好的,你改變了你的數據庫設計,這樣會像這樣:
SELECT * -- should specify columns here
FROM cat1
LEFT JOIN cat2 on cat1.id = cat2.cat1_id1
LEFT JOIN cat3 on cat2.id = cat3.cat2_id
命名差異(cat1_id1 與 cat2_id)很奇怪——我認為 1 可能是錯字。
原回答如下
我猜你的桌子實際上是這樣的
類別 1:
id
cat2id
name
description
類別 2:
id
cat3id
name
description
三類
id
name
description
在我添加的列中,一對多關系由它們相關的 id 表示。
在那種情況下,你可以像這樣加入他們
SELECT * -- should have column list here
FROM cat1
LEFT JOIN cat2 on cat1.cat2id = cat2.id
LEFT JOIN cat3 on cat2.cat3id = cat3.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.