规范化一个简单的SQL表

时间:2016-11-26 16:52:39

标签: php mysql sql-server database database-normalization

我有两个不同的表,我不确定从第一个正常形式到第二个正常形式的最佳方法。第一个表保存用户信息,第二个表是与帐户关联的产品。如果我这样做,我知道它只在NF1中,User_ID的外键将在表2中重复多次。见下表。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<div class="col-md-6">
    <label for="exampleSelect1">Number of Divisions</label>
    <select class="form-control" id="selectDiv" name="select" >
        <option value="0">0</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
    </select>
</div>

<div class="col-md-6" id="test">
</div>

这是一个更好的方法来制作不重复用户ID的表2吗?我曾想过在每个用户的数据库中都有一个单独的表,但是从我在StackOverFlow上读到的所有其他问题来看,这不是一个好主意。

我正在使用的约束是1-1000个用户,而表2将为每个用户提供大约1-1000个索引。有没有更好的方法来创建这组表?

3 个答案:

答案 0 :(得分:0)

我没有看到NF2被侵犯。它声明:

  

如果表格在1NF中,则表格在2NF中,并且非主要属性不依赖于表格中任何候选键的任何正确子集。

引自维基百科文章“第二范式”,2016-11-26

表2只有一个候选键,即主键。主键只包含一列。因此,候选键没有适当的子集。因此,除非不满足NF1,否则不能违反NF2。

答案 1 :(得分:0)

你说“制作不重复用户ID的表2”

然后你为什么不这样做

Table 1

|User_ID (primary)| Name | Address | Email | Username | Password | Product_ID ( Foreign Key nullable)|

Table 2

| Product_ID (Primary Key)| 

答案 2 :(得分:0)

多次出现的值没有任何问题。当两个语法上不等同的查询都返回相同的值时,就会出现冗余。只有不受控制的冗余才是坏事。规范化通过将表替换为与其连接的较小的表来控制一些冗余。

规范化独立于其他表分解表。(我们将数据库的正常形式定义为其所有表所在的最低范式。)外键与违反无关正常形式。

了解表格在给定的正常形式下的含义。您需要学习定义。以及它使用的术语的定义。以及他们使用的术语的定义。等等A table is in 2NF when every non-prime column has a functional dependency that is full on every candidate key.还学习将表分解为给定正规形式的组件的算法。假设这些表可以容纳多个行,因此{}不是候选键,这两个表都是2NF。

2NF中的表也是1NF。因此您不希望“将其从第一个普通表格中删除”。

2NF并不重要。在处理功能依赖时,重要的是BCNF,它尽可能分解但需要某些成本较高的约束,而3NF则不会像可能但需要某些低成本限制。