パフォーマンスの考慮事項:行を複数のテーブルに分散するのではなく、すべての行を1つのテーブルに集中させます。
やあ。
アプリケーションで実行されるすべてのステップに関する情報をSQLDBに記録する必要があります。特定のテーブルがあります。ログを次のように関連付ける必要があります。製品-製品が作成されたときにログに記録する必要があります。注文-上記と同じ配送-同じなど。
データは頻繁に取得する必要があります。
私はそれを行う方法についていくつかのアイデアを持っています:
- これらすべてのテーブルの列を含むログテーブルを用意し、特定の製品のUIでデータを表現する場合は、Logから*を選択します。ここでLogId=Product.ProductIdです。たくさんの列があると面白いかもしれませんが、パフォーマンスが良くなると感じています。一方、このテーブルには大量の行があります。
- ログタイプ(ProductLogs、OrderLogsなど)ごとに多くのログテーブルがあるこのアイデアは一貫性がなく、同じ構造のテーブルがたくさんあるので意味がないので、私は本当に好きではありませんが、(?)検索する方が速いかもしれません行数が少ないテーブルで(間違っていますか?)。
- ステートメント番号によると。1、LogId、TableNameId、およびRowId列を持ち、データを取得するためのUDF(log id 234など)よりも、ログ行をDB内の多くのテーブル行に参照する2番目の多対1テーブルを作成できます。 CustomerId 345のテーブルCustomerと、productId=RowIdのProductテーブルに属します。これが最も良い方法だと思いますが、繰り返しになりますが、大量の行がある可能性があります。検索が遅くなりますか?またはこれはそれがどのように行われるべきか、何と言いますか?...
上記のリストの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