Я стараюсь не изобретать велосипед, когда речь идет о хранении уличных адресов в таблице только один раз. Ограничения уникальности не будут работать в некоторых распространенных ситуациях:
100 W 5th Ave
100 West 5th Ave
100 W 5th
200 N 6th Ave Suite 405
200 N 6th Ave #405
Я мог бы реализовать некоторую бизнес-логику или триггер, чтобы нормализовать все поля перед вставкой и использовать ограничения уникальности для нескольких полей в таблице, но было бы легко пропустить некоторые случаи с чем-то, что сильно отличается от уличных адресов. *
Лучше всего будет универсальный идентификатор для каждого адреса, возможно, основанный на GPS-координатах. Перед сохранением нового адреса посмотрите его GUID и посмотрите, существует ли GUID в таблице адресов.
Такая организация, как Mapquest, Почтовая служба, FedEx или правительство США, вероятно, имеет такую систему.
Кто-нибудь нашел хорошее решение для этого?
Вот моя таблица адресов (генерируется JPA):
CREATE TABLE address
(
id bigint NOT NULL,
"number" character varying(255),
dir character varying(255),
street character varying(255),
"type" character varying(255),
trailingdir character varying(255),
unit character varying(255),
city character varying(255),
state character varying(255),
zip integer,
zip4 integer,
CONSTRAINT address_pkey PRIMARY KEY (id)
)