2016-04-29 63 views
0

我已經閱讀了很多關於規範化的內容,但我仍然無法完全理解它/我不確定如何規範化。這是我的數據庫目前的樣子,它是否需要進行標準化?如果是這樣,我甚至可以從哪裏開始?數據庫正常化我需要它

http://i.imgur.com/L43fHS6.png這是它目前看起來像

+0

如果你無法讓你從一個單一的查詢需要,因爲你必須在一個單元格的數據太多,或者你已經沿着列,而不是你需要數據標準化的行拆分數據的數據。只要您不需要輕鬆訪問個人用戶ID,您擁有的看起來相對較好。這也將停止加入user_ID上的表,所以這是你的電話 – Matt

+1

請參閱[是否在數據庫列中存儲分隔列表真的很糟糕?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited -list-in-a-database-column-really-that-bad) –

+0

那麼我確實需要在特定時間段(start_timestamp,end_timestamp)內訪問個人user_ID,那麼我應該如何規範化呢?即使讀了它,我仍然迷了路。 – Theiq

回答

0

你會希望有每USER_ID 1行,以便您可以輕鬆地訪問所有的數據。

例如對於你的遊戲ID 5002947(第11行),這需要分成以下幾部分:

id  setup_id user_ID 
5002947 997  563749 
5002947 997  500243 
5002947 997  536271 
... 

你有兩個選擇。創建一個複雜的SQL查詢,將處理這個(我不能提供這個不幸的,但我相信別人可以)或使用PHP。

PHP方法

選擇所有的行和爆炸的用戶ID到一個數組。 循環遍歷此數組並插入到數據庫中。 根據您有多少行和用戶標識可能需要一段時間才能執行。

例如

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE); 
$query = 'SELECT * FROM table'; 
$data = mysqli_query($mysqli, $query); 
while($row = mysqli_fetch_array($data)) 
{ 
    $data[] = array("gameid"=>$row['game_ID'], "setupid"=>$row['setup_ID'],"userid"=>str_getcsv($row['user_ID'])); /*And all your other information*/ 
} 

for($i=0; $i<count($data); $i++) { 
    $gameid = $data[$i]['gameid']; 
    $setupid = $data[$i]['setupid']; 
    /*Other info you need*/ 

    for ($x=0; $x<count($data[$i]['userid']);$x++) { 
     $userid = $data[$i]['userid'][$x]; 
     if ($stmt = $mysqli->prepare("INSERT INTO newtable (game_ID, setup_ID, user_ID) VALUES (?, ?, ?)")) { 
      $stmt->bind_param('iii', $gameid ,$setupid ,$userid); 
      if (!$stmt->execute()) { 
       $stmt->close(); 
      } 
     } 

    } 
}