Я пытаюсь сохранить в postgresql базе данных некоторые уникальные идентификаторы наряду с сайтом, на котором они были замечены. Я не могу действительно решить, какую из следующих 3 опций выбрать, чтобы быть быстрее и легкий удобный в сопровождении. Таблица должна была бы предоставить следующую информацию:
Объем данных, который должен был бы содержать, является довольно большим: существует приблизительно 22 миллиона уникальных идентификаторов, о которых я знаю.
Таким образом, я думал о следующих проектах таблицы:
идентификатор - целое число
идентификатор - текст
seen_on_site - целое число, внешний ключ к таблице сайтов
Этот подход потребовал бы приблизительно 22 миллиметров, умноженных на количество сайтов.
идентификатор - целое число
идентификатор - текст
seen_on_site_1 - булевская переменная
seen_on_site_2 - булевская переменная
............
seen_on_site_n - булевская переменная
Надо надеяться, количество сайтов не пойдет прошлые 10. Это потребовало бы только количества уникальных идентификаторов, о которых я знаю, который является приблизительно 20 миллионами, но оно мешало бы работать с ним с точки зрения ORM.
идентификатор - целое число
unique_identifier - текст,
одна таблица, которая сохранила бы только сайты, как в:
идентификатор - целое число
сайт - текст
и один многие многим отношение, как:
идентификатор - целое число,
unique_id - целое число (fk к идентификаторам хранения таблицы)
site_id - целое число (fk к таблице сайтов)
Так, который походит на лучший подход для взятия на длительном периоде?
Есть две таблицы.
Таблица 1
Идентификатор сайта, Имя сайта, Описание сайта
Идентификатор сайта -> первичный ключ
Site Name -> Index
Таблица 2 будет той, о которой вы говорите.
Идентификатор строки, идентификатор сайта, любая информация.
Идентификатор строки —первичный ключ >
Идентификатор сайта -> внешний ключ в таблицу 1
Индекс (идентификатор строки, идентификатор сайта)
Если у вас уже есть естественный текстовый уникальный идентификатор для сайта (URL, возможно?), То единственное, что вам нужно, это ОДНА таблица с два поля:
CREATE TABLE (
unique_identifier TEXT NOT NULL,
site_identifier TEXT NOT NULL,
PRIMARY KEY (unique_identifier, site_identifier)
);
Затем вы также можете добавить УНИКАЛЬНЫЙ ИНДЕКС в (site_identifier, unique_identifier), чтобы облегчить поиск по сайту.
Таким образом, вы можете использовать немного лишнего места для основной таблицы, но его очень просто запрашивать, обновлять и поддерживать.
На вашем месте я бы определенно избегал десятиколоночного булевого ужаса, поскольку позже всегда будет больше сайтов. Я согласен с Romain Hippeau, с дополнительным предложением, что вам может понадобиться индекс сайтов, чтобы ответить на вопросы типа "Кто посещал сайт x?".