0
我已经阅读了很多关于规范化的内容,但我仍然无法完全理解它/我不确定如何规范化。这是我的数据库目前的样子,它是否需要进行标准化?如果是这样,我甚至可以从哪里开始?数据库正常化我需要它
http://i.imgur.com/L43fHS6.png这是它目前看起来像
我已经阅读了很多关于规范化的内容,但我仍然无法完全理解它/我不确定如何规范化。这是我的数据库目前的样子,它是否需要进行标准化?如果是这样,我甚至可以从哪里开始?数据库正常化我需要它
http://i.imgur.com/L43fHS6.png这是它目前看起来像
你会希望有每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();
}
}
}
}
如果你无法让你从一个单一的查询需要,因为你必须在一个单元格的数据太多,或者你已经沿着列,而不是你需要数据标准化的行拆分数据的数据。只要您不需要轻松访问个人用户ID,您拥有的看起来相对较好。这也将停止加入user_ID上的表,所以这是你的电话 – Matt
请参阅[是否在数据库列中存储分隔列表真的很糟糕?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited -list-in-a-database-column-really-that-bad) –
那么我确实需要在特定时间段(start_timestamp,end_timestamp)内访问个人user_ID,那么我应该如何规范化呢?即使读了它,我仍然迷了路。 – Theiq