Mysql

設計廣告橫幅跟踪器

  • December 5, 2019

我正在使用 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語句分支是否存在。由於它是唯一鍵(主鍵是唯一的),它只會被插入一次。這將刪除目前程式碼中的競爭條件。

引用自:https://dba.stackexchange.com/questions/254668