2016-04-29 2 views
0

Я много читал о нормализации, и я до сих пор не могу это полностью понять/Я не уверен, как нормализовать это. Так выглядит моя база данных, даже нужно ее нормализовать? Если да, то где я даже начинаю?нормализация базы данных мне это нужно

http://i.imgur.com/L43fHS6.png это то, что она в настоящее время выглядит как

+0

Если вы не можете получить нужные данные из одного запроса, потому что у вас слишком много данных в одной ячейке или вы разделили данные по столбцам, а не по строкам, вам необходимо нормализовать данные. То, что у вас выглядит относительно хорошо, пока вам не нужно легко обращаться к индивидуальному user_ID. Это также прекратило бы объединение таблиц в user_ID, так что это ваш вызов – Matt

+1

См. [Является ли хранение разделительного списка в столбце базы данных действительно так плохо?] (Http://stackoverflow.com/questions/3653462/is-storing-a-delimited -list-in-a-database-column-really-that-bad) –

+0

Ну, мне нужно получить доступ к отдельному user_ID в течение определенного периода времени (start_timestamp, end_timestamp), в этом случае, как я должен нормализовать это? Даже после чтения на нем я все еще теряюсь. – Theiq

ответ

0

Вы хотите иметь 1 строку для каждого user_id, так что вы можете легко получить доступ ко всем данным.

например. для вашей игрыID 5002947 (row11) необходимо, чтобы это:

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

У вас есть два варианта. Создайте сложный SQL-запрос, который будет обрабатывать это (я не могу предоставить это к сожалению, но я уверен, что другие могут) или использовать php.

метод PHP

Выбрать все строки и взорвать идентификатор_пользователя в массив. проведите через этот массив и вставьте обратно в базу данных. В зависимости от количества строк и идентификаторов пользователя, которые у вас есть, это может занять некоторое время.

например.

$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(); 
      } 
     } 

    } 
} 
Смежные вопросы