Mysql генератор пользовательских последовательностей (как оракул) - PullRequest
3 голосов
/ 28 июля 2010

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

Вот схема.

create table logical_id_seq (
    logical_id int auto_increment,
    primary key(logical_id)
);

create table mytable (
    physical_id int auto_increment,
    logical_id int not null references parent(logical_id),
    data varchar(20),
    version_start_date datetime not null,
    version_end_date datetime not null,
    primary key(physical_id),
    foreign key (logical_id) references logical_id_seq(logical_id),
    unique key (logical_id,version_start_date,version_end_date)
);

Итак, таблица logic_id_seq используется в качестве генератора последовательности.

создание новой сущности:

  1. Вставить новую запись в logic_id_seq.
  2. Считать last_insert_id () из логического_идекса_.
  3. Используйте указанное выше значение для вставки новой строки в таблицу.

Позвольте мне дать вам немного больше контекста по логическому и физическому идентификатору. Я хочу создать базу данных путешествий во времени, то есть хочу, чтобы состояние базы данных было задано с любой отметкой времени (сейчас или в прошлом). Итак, у меня есть version_start_date и version_end_date.

Подскажите, пожалуйста, есть ли побочные эффекты в моем методе генерации последовательности.

Ответы [ 2 ]

1 голос
/ 28 июля 2010

В зависимости от типа вашей таблицы (IIRC это MyISAM и BDB), есть умный прием, который вы можете использовать с автоинкрементом.

create table component_core ( 
    component_id int auto_increment, 
    primary key(component_id) 
); 

create table component_history ( 
    component_id int not null, 
    version_id int auto_increment, 
    data varchar(20), 
    version_start_date datetime not null, 
    version_end_date datetime not null, 
    primary key(component_id,version_id) 
); 

Вставить в component_core при создании нового компонента, а затем использовать этот автоинкрементный идентификатор в качестве component_id при вставке в component_history, и поле автоинкремента version_id там будет иметь значение от 1 и выше для каждого отдельного component_id. При вставке изменения в component_history используйте исходный component_id, но разрешите version_id для автоинкремента в обычном режиме. В этом случае сгенерированное значение для столбца auto_increment рассчитывается как MAX (auto_increment_column) + 1 WHERE component_id = данное-компонент_ид.

Insert a new component_core
Retrieve the last autoincremented value from component_core (1)
Insert a new component_history using the component_id from component_core
Insert a new component_history using the same component_id
Insert a new component_history using the same component_id
Insert a new component_core
Retrieve the last autoincremented value from component_core (2)
Insert a new component_history using the component_id from component_core
Insert a new component_history using the same component_id

Таблицы теперь будут содержать

component_core

component_id
1
2

component_history

component_id version_id
1            1
1            2
1            3
2            1
2            2

Не уверен, что метод поможет, особенно потому, что он ограничен определенными типами таблиц (я думаю, что он работает в MyISAM, но вы теряете контроль транзакций с MyISAM)

EDIT

Ссылка: http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html

0 голосов
/ 28 июля 2010

Итак, я хочу отслеживать изменения в строках (...)

Предлагаю взглянуть на Hibernate Envers , прежде чем внедрятьВаше собственное решение:

Цель проекта Envers - обеспечить легкий аудит / управление версиями постоянных классов.Все, что вам нужно сделать, это пометить ваш постоянный класс или некоторые его свойства, которые вы хотите проверять, с помощью @Audited.Для каждого проверяемого объекта будет создана таблица, в которой будет храниться история изменений, внесенных в объект.Затем вы можете без особых усилий извлекать и запрашивать исторические данные.

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