数据库规范化我需要它吗?

时间:2016-04-29 16:25:40

标签: mysql normalization

我已经阅读了很多关于规范化的内容,但我仍然无法完全理解它/我不确定如何规范化。这就是我的数据库目前的样子,它是否需要规范化?如果是这样,我甚至在哪里开始?

http://i.imgur.com/L43fHS6.png这就是目前的样子

1 个答案:

答案 0 :(得分:0)

您希望每个user_ID有1行,以便您可以轻松访问所有数据。

e.g。对于你的游戏ID 5002947(第11行),这需要拆分为以下内容:

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

您有两种选择。创建一个复杂的SQL查询来处理这个问题(我不能提供这个,但我确定其他人可以)或者使用php。

PHP方法

选择所有行并将userID分解为数组。 循环遍历此数组并插回数据库。 根据您拥有的行数和用户ID,这可能需要一段时间才能执行。

e.g。

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

    }
}