дизайн таблицы для хранения большого количества строк - PullRequest
1 голос
/ 10 мая 2010

Я пытаюсь сохранить в базе данных postgresql некоторые уникальные идентификаторы вместе с сайтом, на котором они были замечены. Я не могу действительно решить, какой из следующих 3 вариантов выбрать, чтобы быть быстрее и проще в обслуживании. Таблица должна содержать следующую информацию:

  • уникальный идентификатор, к сожалению это текст
  • сайты, на которых этот уникальный идентификатор был замечен

Количество данных, которое должно храниться, довольно велико: я знаю около 22 миллионов уникальных идентификаторов.

Итак, я подумал о следующих конструкциях таблицы:

  • id - целое число

    идентификатор - текст

    seen_on_site - целое число, внешний ключ к таблице сайтов

Этот подход потребует около 22 мил, умноженных на количество сайтов.

  • id - целое число

    идентификатор - текст

    seen_on_site_1 - логическое значение

    seen_on_site_2 - логическое значение

    ............

    seen_on_site_n - логическое значение

Надеюсь, количество сайтов не превысит 10. Для этого потребуется только количество уникальных идентификаторов, о которых я знаю, - около 20 миллионов, но с ним будет сложно работать с точки зрения ORM.

  • одна таблица, в которой будут храниться только уникальные идентификаторы, например:

id - целое число

unique_identifier - текст,

одна таблица, в которой будут храниться только сайты, например:

id - целое число

сайт - текст

и отношение один ко многим, например:

id - целое число,

unique_id - целое число (например, таблица с идентификаторами)

site_id - целое число (таблица fk to sites)

  • другой подход будет иметь таблицу, которая хранит уникальные идентификаторы для каждого сайта

Итак, какой из них кажется более подходящим для долгосрочной перспективы?

Ответы [ 3 ]

1 голос
/ 10 мая 2010

Если у вас уже есть естественный текстовый уникальный идентификатор для сайта (возможно, url?), То единственное, что вам нужно, это ОДНА таблица с двумя полями:

CREATE TABLE (
    unique_identifier TEXT NOT NULL,
    site_identifier TEXT NOT NULL,
    PRIMARY KEY (unique_identifier, site_identifier)
);

Затем можно также добавить УНИКАЛЬНЫЙ ИНДЕКС на (site_identifier, unique_identifier) ​​для облегчения поиска по сайту.

Таким образом, вы можете использовать немного больше места для основной таблицы, но запрос, обновление и обслуживание очень просты.

1 голос
/ 10 мая 2010

Есть две таблицы.
Таблица 1 Идентификатор сайта, имя сайта, описание сайта
Идентификатор сайта -> Первичный ключ
Название сайта -> Индекс

Таблица 2 будет той, о которой вы говорите.
Идентификатор строки, идентификатор сайта, любая информация.
Идентификатор строки -> Первичный ключ
Идентификатор сайта -> Внешний ключ в таблицу 1
Индекс (идентификатор строки, идентификатор сайта)

0 голосов
/ 10 мая 2010

Я бы определенно избежал булевского ужаса из десяти столбцов на вашем месте, так как сайтов всегда будет больше. Я согласен с Роменом Хиппо, с добавленным предложением о том, что вы можете захотеть, чтобы индекс на сайтах отвечал на вопросы типа «Кто посетил сайт x?»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...