Разделение таблиц mySQL с внешними ключами? - PullRequest
5 голосов
/ 23 марта 2010

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

Обновление 03/24:

http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html

Как обрабатывать внешний ключ при разбиении

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Это зависит от степени, в которой размер строк в многораздельной таблице является причиной необходимости разбиения.

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

Если размер строки достаточно велик, учитывайте ли вы следующее:

Пусть P будет секционированной таблицей, а F будет таблицей, на которую ссылается потенциальный внешний ключ. Создать новую таблицу X:

CREATE TABLE `X` (
    `P_id` INT UNSIGNED NOT NULL,
        -- I'm assuming an INT is adequate, but perhaps
        -- you will actually require a BIGINT
    `F_id` INT UNSIGNED NOT NULL,
    PRIMARY KEY (`P_id`, `F_id`),
    CONSTRAINT `Constr_X_P_fk`
        FOREIGN KEY `P_fk` (`P_id`) REFERENCES `P`.`id`
        ON DELETE CASCADE ON UPDATE RESTRICT,
    CONSTRAINT `Constr_X_F_fk`
        FOREIGN KEY `F_fk` (`F_id`) REFERENCES `F`.`id`
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci

и, что особенно важно, создайте хранимую процедуру для добавления строк в таблицу P. Ваша хранимая процедура должна убедиться (использовать транзакции), что всякий раз, когда строка добавляется в таблицу P, соответствующая строка добавляется в таблицу X. Вы не должны допускать, чтобы строки добавлялись к P "обычным" способом! Вы можете гарантировать сохранение ссылочной целостности только в том случае, если вы продолжаете использовать свою хранимую процедуру для добавления строк. Вы можете свободно удалить из P обычным способом.

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

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

2 голосов
/ 02 июня 2010

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

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

...