Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 25, 2010 10:16:38

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

хронологическая БД

Здравствуйте, товарищи!

Пытаюсь спроектировать БД, для некоторых таблиц которой важно отслеживать все изменения и сохранять старые данные..
Например, имеется таблица `users`:

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`f_name` varchar(255) NOT NULL,
`l_name` varchar(255) NOT NULL,
`s_name` varchar(255) NOT NULL,
`email` varchar(255) default NULL,
`date_modify` datetime default NULL,
UNIQUE KEY `login` (`login`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Если у какого-то пользователя изменится фамилия, то в таблицу добавляется новая запись с измененными данными и текущая дата изменения..
|  1 | admin | Васильев     | 2010-12-09 12:00:39 | 
| 2 | beemn| Пчелкин | 2010-12-09 12:00:39 |
| 3 | admin | Иванов | 2010-12-25 11:00:39 |
Т.е. актуальной будет наибольшая дата для выбранного пользователя..
НО ТОГДА ПОЛЕ `login` НЕ ПОЛУЧИТСЯ СДЕЛАТЬ УНИКАЛЬНЫМ.. и на уровне БД не будет гарантии несовпадения логинов..
Как мне подружить уникальность и хронологию?
Спасибо.



Офлайн

#2 Дек. 25, 2010 11:53:16

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

хронологическая БД

В таблице users хранить актуальные данные, а в таблице history - список изменений (без уникального поля логин)?

Если актуальные данные определять по MAX(date_modify), то все выборки “более одного юзера” будут либо слишком сложными, либо невозможными.



Офлайн

#3 Дек. 25, 2010 19:40:34

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

хронологическая БД

dimabest
+1

+ активных данных будет необходимый минимум, а всю историю можно затолкнуть будет в отдельную базу т.к. к ней гораздо реже обращаются… ( это к вопросу оптимизации )

Офлайн

#4 Дек. 25, 2010 19:44:39

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

хронологическая БД

Premature optimization is the root of all evil (or at least most of it) in programming. © Donald Knuth

Офлайн

#5 Дек. 26, 2010 17:51:19

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

хронологическая БД

dimabest
В таблице users хранить актуальные данные, а в таблице history - список изменений (без уникального поля логин)?
o7412369815963
+ активных данных будет необходимый минимум, а всю историю можно затолкнуть будет в отдельную базу
Согласен.. логин уникален.. запросы на выборку очень простые.. но:
Тогда таблицы users и history будут иметь практически одинаковую структуру..
и еще нужен триггер, который при изменении данных сохранял бы старые данные..
придется посылать разные запросы на извлечение текущих данных и измененных, а мне бы хотелось заставить систему работать всегда одинаково, независимо от временной метки, на момент которой мы хотим получить данные..
o7412369815963
а всю историю можно затолкнуть будет в отдельную базу
зачем историю хранить отдельно от текущих данных?
Ferroman
Premature optimization is the root of all evil (or at least most of it) in programming. © Donald Knuth
Полностью согласен с высказыванием, но оптимизировать пока еще нечего.. с проектированием бы разобраться..

Может быть id/login/password вынести в отдельную таблицу?



Офлайн

#6 Дек. 26, 2010 18:27:13

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

хронологическая БД

del3d, вы ходите по избитым тропам. Поддерживать полную нормализацию не всегда полезно - и зачастую очень медленно.



Офлайн

#7 Фев. 4, 2011 21:59:11

DcDr
От:
Зарегистрирован: 2011-01-09
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

хронологическая БД

del3d
зачем историю хранить отдельно от текущих данных?
Потому что БД - реляционная.
Для РСУБД предложенное выше разнесение данных на 2 таблицы - естественный способ хранения данных.
К тому, скорее всего для вашего случая - и наиболее быстрые выборки. История ж не каждый раз нужна.



Отредактировано (Фев. 4, 2011 22:00:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version