MySQL数据库:规范化/查询VS加入/唯一索引的距离

时间:2014-07-20 10:12:16

标签: php mysql database-normalization

最近我发现自己设计了一个数据库。该数据库由几个表(InnoDB)组成:

表1:国家/地区 id,country_name

表2:城市 id,city_name,countryid

表3:用户 id, cityid,A ,B,C,D,E

用户表中, A,B,C,D E 是用户的一些特征,其中特征 如果将其与 cityid 结合使用必须是唯一的,这就是我为这两列创建唯一索引的原因:

CREATE UNIQUE INDEX idx_user ON Users(cityid , A);

其余列 B,C,D和E 是其他用户特征(例如头发颜色,高度,重量等),如您所知,将在桌面上重复(头发颜色=黑色,或重量= 75公斤)。

同时 countryid cityid 在UPDATE和DELETE CASCADE上配置为外键。

搜索将基于 cityid A 列。用于选择城市的下拉菜单(因此 cityid )和用于插入特征 A 的文本框,然后点击搜索按钮。

我的问题是:

  1. 用户表格中,我在同一列中重复数据(列 B,C,D和E )。这是针对 2NF 。我是否必须为每个列创建一个单独的表,然后将每个表的外键分配给用户表以实现2NF?

    表B(id,Bchar)

    表C(id,Cchar)

    表D(id,Dchar)

    表E(id,Echar)

    用户(ID, cityid A ,Bid,Cid,Did,Eid)

  2. 当时我不会将 B,C,D E 列用作搜索数据,只有在使用 cityid <搜索后才能显示它们/ strong>和 A 搜索。如果(将来)我决定需要显示 cityid 用户的所有结果并且黑发,我该怎么办?在设计数据库时必须牢记这一点吗?

  3. 一方面,我们有DML(INSERT,UPDATE,DELETE),另一方面是quering(SELECT)。 DML将在规范化DB上更快地工作,并在非规范化DB上查询。有中间解决方案吗?

  4. 上面创建的UNIQUE INDEX是否足以确保 cityid A 列中数据组合的唯一性?我是否需要使用JavaScript或更好的PHP进一步限制它?

  5. 多个查询VS联接: 规范化数据库将需要多个查询或带有连接的单个查询。在&#34;用户从马德里搜索具有特征A&#34;:

    的用户的情况下

    a)多个查询:

    i)转到城市表,找到马德里的ID(例如,id = 2)

    ii)鉴于马德里ID和特征A的输入,转到用户表和 SELECT * FROM Users WHERE cityid =&#34; 2&#34; AND A =&#34;特征&#34 ;;

    b) INNER JOIN:

    i) SELECT City.city_name, Users.B, Users.C FROM City INNER JOIN Users ON Users.cityid = City.id;
    

    我更喜欢哪一个?

  6. 提前致谢。

1 个答案:

答案 0 :(得分:0)

你的表已经在2NF。2NF的条件是不应该有部分依赖。例如,让我们取users表,user-id是主键,另一个主键更适合调用candidate key(cityid,A),您可以使用该(cityid,A)唯一地表示表格中的行。如果cityid或A单独足以唯一地检索B,C,D或E但您的表格不在2NF中case one需要{{1}}来检索唯一记录,因此它已经标准化。

注意:

你的桌子不在3NF.3NF的条件是没有传递依赖。请在这里取用户表userid是主键,你可以得到一个唯一的(cityid,A)对与转而你可以得到一个唯一的(B,C,D,E)记录,其中(cityid,A)是从userid获得的。简而言之,如果A-> B和B-> C间接A-> C,这被称为传递依赖关系,它存在于您的用户表中,因此它不适合3NF。