Вот вымышленный сценарий с некоторыми заполненными данными.В целях налогообложения моя вымышленная компания должна хранить записи исторических данных.По этой причине я включил столбец версии в таблицу.
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
решит эту проблему?
EDIT 2:
Я думаю, что я мог бы сделать это, выполнив что-то вроде этого: Человек А загружает запись 3 сотрудника в его сеансе, и его дата вступления в силу 1-1-2010, 1:00 вечера, без каких-либо излишеств.Человек B загружает запись 3 сотрудника в его сеансе, и его дата вступления в силу 1-1-2010, 1:00 вечера, без каких-либо излишествЧеловек А вносит изменения и совершает.Старая копия отправляется в архивную таблицу (в основном идея 2) с датой завершения работы 22.09.2010 13:00.Обновленная версия основной таблицы имеет дату вступления в силу 22.09.2010 13:00.Человек Б вносит изменения и совершает.Не удается выполнить фиксацию, поскольку даты вступления в силу (в базе данных и сеансе) не совпадают.