Если у меня есть таблица установленного оборудования с маркой и моделью, где марка и модель будут многократно дублированы, но с различными вариантами написания и т. Д., Как лучше всего избежать потери пространства из-за дублирования данных?
CREATE TABLE equipment (
id integer NOT NULL,
make character varying(128),
model character varying(128),
lat double precision,
lon double precision,
created timestamp without time zone,
updated timestamp without time zone
);
В этой таблице гораздо больше полей, и в ней будет много миллионов строк, и у меня есть другие таблицы в аналогичной ситуации с общим объемом данных около 600 ГБ.
Исходные данныедолжно быть одинаковым (т. е. «Panasonic» и «PANASONIC» не могут быть объединены / исправлены), а масштаб и разнообразие данных делают это непрактичным в любом случае.
Я предполагаю отдельноеТаблица key: value, в которой хранятся значения, а затем идентификатор просто сохраняется в таблице оборудования, с функцией, в которой я просто передаю значение, и оно возвращает идентификатор (независимо от того, просматривает ли он его, возвращает ли идентификатор или вставляет его и возвращаетновый идентификатор).
Это приведет к тому, что таблицы станут:
CREATE TABLE equipment (
id integer NOT NULL,
make integer,
model integer,
lat double precision,
lon double precision,
created timestamp without time zone,
updated timestamp without time zone
);
CREATE TABLE lookup (
id integer NOT NULL,
value character varying(128),
updated timestamp without time zone
);
И взаимодействие с таблицей будет:
SELECT
id,
lookup_value(make) AS make,
lookup_value(model) AS model,
lat,
lon,
created,
updated
FROM
equipment
INSERT INTO
equipment (id, make, model, created)
VALUES
(nextval('equipment_id_seq'::regclass), lookup_value('Panasonic'), lookup_value('ABC123-G'), NOW())
таблица поиска может быть повторно использована в различных полях и таблицах, при этом каждое строковое значение появляется только один раз, а ключ: значение остается неизменным навсегда (изменение «Panasonic» и «PANASONIC» не изменит ключ для «Panasonic», вместо этого он вернул бы ключ для «PANASONIC», вставив при необходимости).
Какие проблемы возникают у этого подхода (кроме сложности кода)?
Есть ли лучший подход?