設計図: サイト情報
DESIGN
■ TABLE
StationCounter
各ステーションのアクセス数を格納します。
テーブル設計
FIELD TYPE KEY NULL DEFAULT NOTE CounterID longkey PRIMARY - AUTO 主キー StationID key FOREIGN - ステーション ID RegistYear smallint - DATEPART(YEAR, GETDATE()) 登録された年 RegistMonth tinyint - DATEPART(MONTH, GETDATE()) 登録された月 RegistDay tinyint - DATEPART(DAY, GETDATE()) 登録された日 RegistHour tinyint - DATEPART(HOUR, GETDATE()) 登録された時間 TotalCount int - 1 1時間毎のアクセス数
外部キー
FIELD REFERENCE NOTE StationID StationInformation.StationID
StationInformation
各ステーションの情報です。
テーブル設計
FIELD TYPE KEY NULL DEFAULT NOTE StationID key PRIMARY - 主キー Name nvarchar/64 - 名称 Homepage varchar/256 OK サイトのアドレス Note nvarchar/200 OK 備考欄 BasicColor varchar/8 OK 基調となる色 LastUpdate datetime - GETDATE() 各種データベース更新時にトリガによって自動更新
StationMessage
各ステーションのショートメッセージです。
テーブル設計
FIELD TYPE KEY NULL DEFAULT NOTE MessageID longkey PRIMARY - IDENTITY(1, ) 主キー StationID key FOREIGN - ステーション ID RegistDate datetime - GETDATE() 登録日 Message nvarchar/200 - メッセージ本文
外部キー
FIELD REFERENCE NOTE StationID StationInformation.StationID
トリガ
メッセージが追加された場合に、StationInformation の LastUpdate の日付を自動的に更新します。 このテーブルは追加が一般的なため、削除および再編集では更新日時の変更は行いません。
CREATE TRIGGER [tr_StationMessage]
ON dbo.StationMessage
FOR INSERT
NOT FOR REPLICATION
AS
UPDATE StationInformation
SET LastUpdate = GETDATE()
WHERE StationID IN (SELECT DISTINCT StationID FROM INSERTED)
RETURN
■ VIEW
ViewStationCounterTotalAccess
各ステーションの総アクセス数を集計します。
ビュー設計
FIELD ORG-TABLE ORG-FIELD NOTE StationID StationCounter TotalCount StationCounter SUM(TotalCount) アクセス総数
実装
SELECT StationID, SUM(TotalCount) AS TotalCount
FROM dbo.StationCounter
GROUP BY StationID
ViewStationCounterYearlyAccess
年別のアクセス数を集計します。
ビュー設計
FIELD ORG-TABLE ORG-FIELD NOTE StationID StationCounter TotalCount StationCounter SUM(TotalCount) アクセス総数/年 RegistYear StationCounter
実装
SELECT StationID, SUM(TotalCount) AS TotalCount, RegistYear
FROM dbo.StationCounter
GROUP BY StationID, RegistYear
ViewStationCounterMonthlyAccess
月別のアクセス数を集計します。
ビュー設計
FIELD ORG-TABLE ORG-FIELD NOTE StationID StationCounter TotalCount StationCounter SUM(TotalCount) アクセス総数/月 RegistYear StationCounter RegistMonth StationCounter
実装
SELECT StationID, SUM(TotalCount) AS TotalCount, RegistYear, RegistMonth
FROM dbo.StationCounter
GROUP BY StationID, RegistYear, RegistMonth
ViewStationCounterDailyAccess
日別のアクセス数を集計します。
ビュー設計
FIELD ORG-TABLE ORG-FIELD NOTE StationID StationCounter TotalCount StationCounter SUM(TotalCount) アクセス総数/日 RegistYear StationCounter RegistMonth StationCounter RegistDay StationCounter
実装
SELECT StationID, SUM(TotalCount) AS TotalCount, RegistYear, RegistMonth, RegistDay
FROM dbo.StationCounter
GROUP BY StationID, RegistYear, RegistMonth, RegistDay
■ STORED PROCEDURE
sp_StationCounterTotalAccess
指定したステーションの総アクセス数を取得します。ステーションを指定しなかった場合には、全てのステーションの総アクセス数を取得します。
引数
PARAM TYPE DEFAULT NOTE @StationID key NULL 対象の StationID
戻り値
PARAM TYPE NOTE TotalCount int 総アクセス数
実装
CREATE PROCEDURE [sp_StationCounterTotalAccess]
@StationID INT = NULL
AS
SET NOCOUNT ON
DECLARE @Count INT
IF @StationID IS NULL
SELECT @Count = SUM(TotalCount) FROM StationCounter
ELSE
SELECT @Count = SUM(TotalCount) FROM StationCounter WHERE StationID = @StationID
SELECT @Count AS TotalCount
sp_StationCounterAdd
指定したステーションのアクセスカウントを増加させます。
引数
PARAM TYPE DEFAULT NOTE @StationID key 対象の StationID @AddValue int 1 アクセスカウンタの増加値
戻り値
PARAM TYPE NOTE NewCount int 増加後の通算アクセス数
実装
CREATE PROCEDURE [sp_StationCounterAdd]
@StationID [key],
@AddValue INT = 1
AS
SET NOCOUNT ON
DECLARE @Year SMALLINT
DECLARE @Month TINYINT
DECLARE @Day TINYINT
DECLARE @Hour TINYINT
DECLARE @Time DATETIME
DECLARE @CounterID [longkey]
SET @Time = GETDATE()
SET @Year = DATEPART(YEAR, @Time)
SET @Month = DATEPART(MONTH, @Time)
SET @Day = DATEPART(DAY, @Time)
SET @Hour = DATEPART(HOUR, @Time)
SELECT @CounterID = CounterID FROM StationCounter
WHERE StationID = @StationID
AND RegistYear = @Year AND RegistMonth = @Month
AND RegistDay = @Day AND RegistHour = @Hour
IF @CounterID IS NULL
INSERT INTO StationCounter
(
StationID, RegistYear, RegistMonth, RegistDay, RegistHour
)
VALUES
(
@StationID, @Year, @Month, @Day, @Hour
)
ELSE
UPDATE StationCounter
SET TotalCount = TotalCount + @AddValue
WHERE CounterID = @CounterID
-- 最終出力
SELECT SUM(TotalCount) AS NewCount
FROM StationCounter
WHERE StationID = @StationID