Здесь вымышленный сценарий с некоторыми населенными данными. Для целей налогообложения моя вымышленная компания должна сохранять записи исторических данных. По этой причине я включил столбец версии в таблицу.
TABLE EMPLOYEE: (with personal commentary)
|ID | VERSION | NAME | Position | PAY |
+---+---------+------------+----------+-----+
| 1 | 1 | John Doe | Owner | 100 | Started company
| 1 | 2 | John Doe | Owner | 80 | Pay cut to hire a coder
| 2 | 1 | Mark May | Coder | 20 | Hire said coder
| 2 | 2 | Mark May | Coder | 30 | Productive coder gets raise
| 3 | 1 | Jane Field | Admn Asst| 15 | Need office staff
| 2 | 3 | Mark May | Coder | 35 | Productive coder gets raise
| 1 | 3 | John Doe | Owner | 120 | Sales = profit for owner!
| 3 | 2 | Jane Field | Admn Asst| 20 | Raise for office staff
| 4 | 1 | Cody Munn | Coder | 20 | Hire another coder
| 4 | 2 | Cody Munn | Coder | 25 | Give that coder raise
| 3 | 3 | Jane Munn | Admn Asst| 20 | Jane marries Cody <3
| 2 | 4 | Mark May | Dev Lead | 40 | Promote mark to Dev Lead
| 4 | 3 | Cody Munn | Coder | 30 | Give Cody a raise
| 2 | 5 | Mark May | Retired | 0 | Mark retires
| 5 | 1 | Joey Trib | Dev Lead | 40 | Bring outside help for Dev Lead
| 6 | 1 | Hire Meplz | Coder | 10 | Hire a cheap coder
| 3 | 4 | Jane Munn | Retired | 0 | Jane quits
| 7 | 1 | Work Fofre | Admn Asst| 10 | Hire Janes replacement
| 8 | 1 | Fran Hesky | Coder | 10 | Hire another coder
| 9 | 1 | Deby Olav | Coder | 25 | Hire another coder
| 4 | 4 | Cody Munn | VP Ops | 80 | Promote Cody
| 9 | 2 | Deby Olav | VP Ops | 80 | Cody fails at VP Ops, promote Deby
| 4 | 5 | Cody Munn | Retired | 0 | Cody retires in shame
| 5 | 2 | Joey Trib | Dev Lead | 50 | Give Joey a raise
+---+---------+------------+----------+-----+
Теперь, если бы я хотел сделать что-то вроде "Получить список текущих кодеров", я не мог просто сделать SELECT * FROM EMPLOYEE WHERE Position = 'Coder'
, потому что это вернет много исторических данных... что плохо.
Я ищу хорошие идеи для решения этого сценария. Я вижу несколько вариантов, которые выпрыгивают на меня, но я уверен, что кто-то скажет: "Вау, что ошибка новобранец, свечение... попробуй это для размера:" вот что это за место, не так ли?: -)
Идея номер 1: Сохраните таблицу версий с текущей версией, подобной этой
TABLE EMPLOYEE_VERSION:
|ID |VERSION|
+---+-------+
| 1 | 3 |
| 2 | 5 |
| 3 | 4 |
| 4 | 6 |
| 5 | 2 |
| 6 | 1 |
| 7 | 1 |
| 8 | 1 |
| 9 | 2 |
+---+-------+
Хотя я не уверен, как это сделать с одним запросом, я уверен, что это можно сделать, и я уверен, что я мог бы понять это с небольшим усилием.
Конечно, мне пришлось бы обновлять эту таблицу каждый раз, когда я вставляю в таблицу EMPLOYEE, чтобы увеличить версию для данного идентификатора (или вставить в таблицу версий при создании нового идентификатора).
Накладные расходы на это кажутся нежелательными.
Идея номер 2: Храните таблицу архива и основную таблицу. Перед обновлением основной таблицы вставьте строку, которую я собираюсь переписать в таблицу архива, и использую основную таблицу, как обычно, так, как будто меня не интересовало управление версиями.
Идея номер 3: Найдите запрос, который добавляет что-то вдоль строк SELECT * FROM EMPLOYEE WHERE Position = 'Coder' and version=MaxVersionForId(EMPLOYEE.ID)
... Не совсем уверен, как я это сделаю. Мне кажется, это лучшая идея, но на данный момент я действительно не уверен.
Идея номер 4: Создайте столбец для "current" и добавьте "WHERE current = true AND..."
Мне кажется, что люди действительно делали это раньше, сталкиваются с этими же проблемами и имеют представление об этом, чтобы поделиться, и поэтому я пришел, чтобы собрать это!:) Я уже пытался найти примеры проблемы здесь, но они, похоже, специализируются на конкретном сценарии.
Спасибо!
РЕДАКТИРОВАТЬ 1:
Во-первых, я ценю все ответы, и вы все говорили то же самое - DATE
лучше, чем VERSION NUMBER
. Одна из причин, по которой я шел с VERSION NUMBER
, заключалась в том, чтобы упростить процесс обновления на сервере, чтобы предотвратить следующий сценарий
Лицо A загружает запись сотрудника 3 в свою сессию и имеет версию 4. Лицо B загружает запись сотрудника 3 в свою сессию и имеет версию 4. Лицо А вносит изменения и совершает. Это работает, потому что самая последняя версия в базе данных - 4. Теперь она 5. Лицо B вносит изменения и совершает. Это терпит неудачу, потому что самая последняя версия - 5, а его 4.
Как шаблон шаблона EFFECTIVE DATE
устранит эту проблему?
ИЗМЕНИТЬ 2:
Я думаю, что смогу сделать это, сделав что-то вроде этого: Лицо A загружает запись сотрудника 3 в свою сессию, и дата вступления в силу 1-1-2010, 13:00, без опыта. Лицо B загружает запись сотрудника 3 в свою сессию, и ее дата вступления в силу 1-1-2010, 13:00, без опыта. Лицо А вносит изменения и совершает. Старая копия переходит к таблице архива (в основном идея 2) с датой проведения тестирования 22.09.2010 13:00. Обновленная версия основной таблицы имеет дату вступления в силу 22.09.2010 13:00. Лицо B вносит изменения и совершает. Конец не выполняется, потому что эффективные даты (в базе данных и сеансе) не совпадают.