Mysql
設計廣告橫幅跟踪器
我正在使用 PHP 為我網站上的廣告橫幅創建一個廣告橫幅跟踪器。跟踪器將跟踪每個橫幅的獨特展示次數、總展示次數、獨特點擊次數和總點擊次數。
我用來檢測獨特印象/點擊的方法是使用 IP。我認為需要以下四個表:
- 橫幅- 用於儲存每個橫幅的資訊。
- 唯一印象資訊- 主要用於儲存查看橫幅的訪問者的 IP。
- 唯一點擊資訊- 用於儲存點擊橫幅的唯一訪問者的詳細資訊(IP、國家、設備、瀏覽器、作業系統等)。
- 總點擊資訊- 用於儲存每個點擊橫幅的訪問者的詳細資訊(IP、國家、設備、瀏覽器、作業系統等)。
為了儲存展示次數和點擊次數,我將使用橫幅表的這四列:“獨特展示次數”、“總展示次數”、“獨特點擊次數”和“總點擊次數”。
計算展示次數(或點擊次數)的邏輯如下:
- 如果在數據庫中未找到訪問者的 IP,則 IP 將儲存在數據庫中,並且訪問者會將Banner表的 Unique 和 Total Impression(或 Click)列的值都增加 1。
- 如果在數據庫中找到訪問者的 IP,訪問者只會將Banner表的 Total Impression(或 Click)列的值再次增加 1。
我現在不想知道只查看但不點擊橫幅的訪問者的詳細資訊。這就是儲存在Unique Impression Informaion表中的訪問者資訊只是 IP 的原因。
非常感謝有關這種數據庫設計效率的建議。
==更新==
CREATE TABLE
聲明將是:CREATE TABLE `Banner` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Unique Impression` int(15) NOT NULL, `Total Impression` int(15) NOT NULL, `Unique Click` int(15) NOT NULL, `Total Click` int(15) NOT NULL, /* Columns like `Name`, `Url`, `Src`, etc are omitted at here */ PRIMARY KEY (ID) );
/* CREATE TABLE `Unique Impression IP` */ -- before changing table name CREATE TABLE `Unique Impression Information` ( `ID` int(15) NOT NULL AUTO_INCREMENT, `IP` VARCHAR(255) NOT NULL, `Banner ID` int(11) NOT NULL, PRIMARY KEY (ID) );
CREATE TABLE `Unique Click Information` ( `ID` int(15) NOT NULL AUTO_INCREMENT, `IP` VARCHAR(255) NOT NULL, `Banner ID` int(11) NOT NULL, /* Columns like `Country`, `Device`, `Browser`, etc are omitted at here */ PRIMARY KEY (ID) );
CREATE TABLE `Total Click Information` ( `ID` int(15) NOT NULL AUTO_INCREMENT, `IP` VARCHAR(255) NOT NULL, `Banner ID` int(11) NOT NULL, /* Columns like `Country`, `Device`, `Browser`, etc are omitted at here */ PRIMARY KEY (ID) );
例如,用於檢測獨特印象的 MySQL quies 將是:
$check_ip = mysqli_query($conn, "SELECT `IP`, `Banner ID` from `Unique Impression Information` WHERE `IP` = '$visitor_ip' AND `Banner ID` = '$banner_id'"); if (mysqli_num_rows($check_ip) === 0) { mysqli_query($conn, "INSERT INTO `Unique Impression IP` (`IP`, `Banner ID`) VALUES ('$visitor_ip', '$banner_id')"); mysqli_query($conn, "UPDATE `Banner` SET `Unique Impression` = `Unique Impression` + 1, `Total Impression` = `Total Impression` + 1 WHERE `ID` = '$banner_id'"); } else { mysqli_query($conn, "UPDATE `Banner` SET `Total Impression` = `Total Impression` + 1 WHERE `ID` = '$banner_id'"); }
因為
Unique Impression IP
不需要自增主鍵,所以VARBINARY(16)
用於 IP 地址,並作為主鍵。插入時使用INET6_ATON()以保持其緊湊形式。採用:
INSERT IGNORE INTO `Unique Impression IP` VALUES (INET6_ATON($var))
並查看受影響的行以查看您的
UPDATE Banner
語句分支是否存在。由於它是唯一鍵(主鍵是唯一的),它只會被插入一次。這將刪除目前程式碼中的競爭條件。