Добавление столбца в большую таблицу: тип данных или INT или справочная таблица? - PullRequest
1 голос
/ 20 марта 2012

У меня есть таблица с 300.000+ записями.

Я хочу добавить несколько «маркеров» в небольшую часть записей (0,5% или меньше);

что будет лучшим выбором:

  • Используйте поле INT и обрабатывайте его как двоичную строку

    маркер 0: xxxxx1 будет сохранен как1,

    , маркер 0 и 3: xx1001 будет сохранен как 9, ecc ..

  • Использовать тип данных SET

  • Используйте справочную таблицу и присоединяйтесь к ним;что-то вроде

    mydata: id |..

    маркеры: id |маркер

    mydata_marker: mydata_id |markers_id

  • Добавить другие поля (мне не нравится идея заполнения таблицы нулями)

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

Я не знаю, как комментировать второй вариант, потому что я никогда не использовал этот тип данных.

По-моему, я бы выбрал третий вариант ...

Любой совет?

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Я бы полностью исключил первый вариант, потому что он требует внешней обработки или некрасивых запросов, чтобы выяснить, что происходит, и это сделает изменение работы этих маркеров позже болезненным.

Я бы использовал третий вариант: составить таблицу маркеров с любой информацией, которую вы к ним прикрепляете (по крайней мере, идентификатор и имя) и таблицу для has_marker или чего-то подобного.Для has_marker нужен только первичный ключ существующей записи и первичный ключ добавляемого маркера.Включите внешние ключи, уникальные (record_id, marker_id), если они соответствуют вашей модели данных, и рассмотрите возможность индексации обоих столбцов в качестве повышения скорости в зависимости от того, что ваш код делает с ними.

Это может быть немного громоздко, но это дает вам большую свободу для реализации и будущих изменений.Он также хранит все ваши данные в базе данных (вместо того, чтобы требовать как базы данных, так и вашей интерпретации того, что означают маркеры «9» или «1001010101» или любой другой подобной системы), и позволяет легко запрашивать данные в обоих направлениях (какие маркеры).имеет ли эта запись ИЛИ какие записи имеют эти / эти маркеры) с простыми объединениями.Наконец, добавление совершенно нового маркера с помощью этого метода тривиально - создайте новую строку в таблице маркеров и добавьте has_marker для каждой записи, которая должна иметь его.

2 голосов
/ 20 марта 2012

Учитывая, что вы говорите, что только 0,5% записей будут иметь какие-либо маркеры, было бы лучше разделить маркеры на их собственные дочерние таблицы. Получив эту дочернюю таблицу, вы не будете тратить почти столько же места и сможете использовать int, буквальное * mysql битовое поле , отдельные поля для каждого флага и т. Д ...

например. Предполагая только 8 флагов, вам нужно поле tinyint, которое составляет 1 байт. Это было бы ~ 290 КБ памяти потрачено впустую. Разделение его на собственную дочернюю таблицу приводит к небольшим накладным расходам для новой таблицы, а затем ~ 10 КБ для хранения отдельных записей флагов.

...