Оценка производительности: распределение строк в нескольких таблицах по сравнению с концентрацией всех строк в одной таблице.
Привет.
Мне нужно регистрировать информацию о каждом шаге, который происходит в приложении, в БД SQL.
Есть определенные таблицы, я хочу, чтобы журнал был связан с:
Продукт - должен регистрироваться, когда продукт был создан, изменен и т. Д.
Заказ - так же, как выше
Доставка - такая же
и т. д. и т. д.
Данные нужно будет часто получать.
У меня мало идей о том, как это сделать:
- Имейте таблицу журнала, которая будет содержать столбцы для всех этих таблиц, тогда, когда я хочу представить данные в пользовательском интерфейсе для определенного продукта, выберите * из журнала, где LogId = Product.ProductId.
Я знаю, что было бы смешно иметь много cols, но я чувствую, что производительность будет лучше. С другой стороны, в этой таблице будет огромное количество строк.
- Наличие большого количества таблиц журналов для каждого типа журналов (ProductLogs, OrderLogs и т. Д.). Мне действительно не нравится эта идея, поскольку она не согласована и иметь много таблиц с одинаковой структурой не имеет смысла, но (?) Это может быстрее при поиске в таблице с меньшим количеством строк (не так ли?).
- Согласно заявлению № 1, я мог бы создать вторую таблицу многие-к-одному, которая будет иметь столбцы LogId, TableNameId и RowId и будет ссылаться на строку журнала во многих строках таблицы в БД, чем будет иметь UDF для получения данных (например, идентификатор журнала 234 принадлежит таблице Customer с CustomerId 345 и таблице Product, где productId = RowId); Я думаю, что это самый хороший способ сделать это, но опять же, может быть огромное количество строк, это замедлит поиск? или это как надо, что скажешь? ...
Пример № 3 в приведенном выше списке:
CREATE TABLE [dbo].[Log](
[LogId] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NULL,
[Description] [varchar](1024) NOT NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[LogId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Log] WITH CHECK ADD CONSTRAINT [FK_Log_Table] FOREIGN KEY([UserId])
REFERENCES [dbo].[Table] ([TableId])
GO
ALTER TABLE [dbo].[Log] CHECK CONSTRAINT [FK_Log_Table]
---------------------------------------------------------------------
CREATE TABLE [dbo].[LogReference](
[LogId] [int] NOT NULL,
[TableName] [varchar](32) NOT NULL,
[RowId] [int] NOT NULL,
CONSTRAINT [PK_LogReference] PRIMARY KEY CLUSTERED
(
[LogId] ASC,
[TableName] ASC,
[RowId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[LogReference] WITH CHECK ADD CONSTRAINT [FK_LogReference_Log] FOREIGN KEY([LogId])
REFERENCES [dbo].[Log] ([LogId])
GO
ALTER TABLE [dbo].[LogReference] CHECK CONSTRAINT [FK_LogReference_Log]
---------------------------------------------------------------------
CREATE FUNCTION GetLog
(
@TableName varchar(32),
@RowId int
)
RETURNS
@Log TABLE
(
LogId int not null,
UserId int not null,
Description varchar(1024) not null
)
AS
BEGIN
INSERT INTO @Log
SELECT [Log].LogId, [Log].UserId, [Log].Description
FROM [Log] INNER JOIN
LogReference ON [Log].LogId = LogReference.LogId
WHERE (LogReference.TableName = @TableName) AND (LogReference.RowId = @RowId)
RETURN
END
GO