最近我发现自己设计了一个数据库。该数据库由几个表(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 的文本框,然后点击搜索按钮。
我的问题是:
在用户表格中,我在同一列中重复数据(列 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)
当时我不会将 B,C,D 和 E 列用作搜索数据,只有在使用 cityid <搜索后才能显示它们/ strong>和 A 搜索。如果(将来)我决定需要显示 cityid 中用户的所有结果并且黑发,我该怎么办?在设计数据库时必须牢记这一点吗?
一方面,我们有DML(INSERT,UPDATE,DELETE),另一方面是quering(SELECT)。 DML将在规范化DB上更快地工作,并在非规范化DB上查询。有中间解决方案吗?
上面创建的UNIQUE INDEX是否足以确保 cityid 和 A 列中数据组合的唯一性?我是否需要使用JavaScript或更好的PHP进一步限制它?
多个查询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;
我更喜欢哪一个?
提前致谢。
答案 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。