Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / одна таблица аудита для всех таблиц / 12 сообщений из 12, страница 1 из 1
19.02.2012, 14:51
    #37669213
javaprog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE audit (
audit_id serial not null primary key,
create_date timestamp,
create_user_id int references users(user_id),
create_ip inet, 
create_server int,
.....
);

create table test(
test_id not null primary key,
audit_id references audit(audit_id),
.....
);

какой минус у такого подхода, кроме того, что эта таблица будет самой юзабельной?
...
Рейтинг: 0 / 0
19.02.2012, 15:33
    #37669245
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
Вы бы поподробнее расписали подход, что же вы хотите.
Заменить create_user_id, create_date ... одним audit_id?
Не стоит овчинка выделки, эти поля можно использовать для оптимистического блокирования.

И давайте на бережку договоримся - что вы называете аудит.
По поводу смешения в одну таблицу - а где вы видите плюсы? Экономия на числе таблиц?
А вот минусы - truncate не сделать, по дискам не разнести и т.д. divide et impera

Далее к слову. Я на журналы делал первичным ключом пару event_datetime + event_id. Так было удобнее
...
Рейтинг: 0 / 0
19.02.2012, 15:48
    #37669252
javaprog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
SERG1257Заменить create_user_id, create_date ... одним audit_id?

да
SERG1257И давайте на бережку договоримся - что вы называете аудит.
фиксировать кто/когда/где изменял запись
SERG1257По поводу смешения в одну таблицу - а где вы видите плюсы? Экономия на числе таблиц?на числе столбцов(минимум 7). если таблиц за сотню, может получится какая то экономия. правда придется лишние join делать.
SERG1257А вот минусы - truncate не сделать, по дискам не разнести и т.д. divide et imperatruncate не нужен. можно создать tablespace на другом диске или сделать партиционирование таблицы (postgresql).
...
Рейтинг: 0 / 0
19.02.2012, 17:42
    #37669349
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
javaprog, ещё минусы:
1. большое количество связей с одной таблицей. удалении записей из таблицы аудита - трудоёмкая операция.

2. дополнительный join при поиске пользователем "своих" записей (может быть важным в зависимости от задачи).
...
Рейтинг: 0 / 0
19.02.2012, 19:36
    #37669440
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
javaprog фиксировать кто/когда/где изменял записьНо без ЧТО было изменено
javaprog может получится какая то экономияЭкономии на объеме данных не будет ибо нет разницы в какой таблице хранить эти 7 полей. Может вам стоит завести таблицу Сессия без create_date. Тогда можно говорить о какой-то экономии.
javaprog truncate не нуженТо есть о чистке этих таблицы (с выгрузкой из рабочей базы) вы не задумывались.
...
Рейтинг: 0 / 0
19.02.2012, 21:15
    #37669508
javaprog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
SERG1257Но без ЧТО было измененособирался кидать изменения в другую таблицу. буду делать по старинке. спасибо.
...
Рейтинг: 0 / 0
20.02.2012, 12:08
    #37670085
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
> CREATE TABLE audit (
> audit_id serialnot null primary key,
> create_datetimestamp,
> create_user_idint references users(user_id),
> create_ip inet,
> create_serverint,
> ....
> );
>
> create table test(
> test_idnot null primary key,
> audit_id references audit(audit_id),
> ....
> );


За точечками-то что скрывается ?
Гюльчатай, личико-то открой ...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.02.2012, 12:53
    #37670190
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
javaprog,

В схеме которую ты предложил для таблиц у которых включен аудит есть доп. поле audit_id для связи с таблицей аудита? Т.е. получается что все таблицы завязаны на таблице аудита. Можно сделать по другому.
В таблице audit завести поле audit_tabname_id, создать справочник с таблицами для которых включен аудит (id, audit_tabname) для связи с таблицей audit, и не надо будет в каждой таблице для которой включается аудит создавать поле audit_id.
...
Рейтинг: 0 / 0
21.02.2012, 05:38
    #37671541
javaprog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
MasterZivами-то что скрывается ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE audit (
audit_id serial not null primary key,
create_date timestamp,
create_user_id int references users(user_id),
create_ip inet, 
update_server int,
update_date timestamp,
update_user_id int references users(user_id),
update_ip inet, 
update_server int
);


Andronтак лучше
...
Рейтинг: 0 / 0
21.02.2012, 11:50
    #37671955
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
> ами-то что скрывается ?
>
> CREATE TABLE audit (
> audit_id serialnot null primary key,
> create_datetimestamp,
> create_user_idint references users(user_id),
> create_ip inet,
> update_serverint,
> update_datetimestamp,
> update_user_idint references users(user_id),
> update_ip inet,
> update_serverint
> );

Т.е. старые или новые данные таблицы ты там хранить не собираешься.
Тогда действительно незачем делать отдельные таблицы.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2012, 14:29
    #37672432
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
MasterZivТогда действительно незачем делать отдельные таблицы.

Ну, может у него высоконагруженная система и эта таблица становится бутылочным горлышком,
которое просаживает общую производительность...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.02.2012, 20:05
    #37673315
javaprog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одна таблица аудита для всех таблиц
MasterZivТ.е. старые или новые данные таблицы ты там хранить не собираешься.
Тогда действительно незачем делать отдельные таблицы.

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

чего не буду делать)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
create table test(
test_id serial not null primary key,
a text
);

create table au_test(
test_id int,
a text
);

CREATE TABLE audit (
audit_id serial not null primary key,
table_oid oid,
oper char(1),
mod_user varchar(50),
mod_date timestamp
);

create or replace function tf_audit() returns trigger 
as
$$
declare 
  sql text;
begin
  if TG_OP='INSERT' then
    insert into audit(table_oid, oper, mod_user, mod_date) 
    select TG_RELID, 'i', current_user, now();

  elseif TG_OP='UPDATE' then
    insert into audit(table_oid, oper, mod_user, mod_date) 
    select TG_RELID, 'u', current_user, now();

   execute 'insert into au_'||TG_TABLE_NAME||' select $1.*' USING  old;  
     
  elseif TG_OP='DELETE' then
    insert into audit(table_oid, oper, mod_user, mod_date) 
    select TG_RELID, 'd', current_user, now();

    execute 'insert into au_'||TG_TABLE_NAME||' select $1.*' USING  old; 
 
  end if; 

  if TG_OP='DELETE' then
    return old;
  else 
    return new;
  end if;    
end;
$$
language 'plpgsql';

CREATE TRIGGER trg_test
  BEFORE INSERT OR UPDATE OR DELETE
  ON test
  FOR EACH ROW
  EXECUTE PROCEDURE tf_audit();

insert into test (a) values ('aaa');
update test set a='bbb' where test_id=1;
delete from test where test_id=1;
select * from audit;
--select * from au_test;
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / одна таблица аудита для всех таблиц / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]