[英]MySQL Database: How far to Normalize / Queries VS Join / Unique Index
最近,我发现自己正在设计一个数据库。 该数据库由几个表(InnoDB)组成:
表1: 国家 ( id,country_name )
表2: 城市 ( ID,city_name,countryid )
表3: 用户 ( id, cityid,A ,B,C,D,E )
在“ 用户”表上, A,B,C,D和E是用户的某些特征,其中特征A(如果将其与cityid结合使用)必须是唯一的,这就是为什么我为这两列创建了唯一索引的原因:
CREATE UNIQUE INDEX idx_user ON Users(cityid , A);
其余的B,C,D和E列是用户的其他特征(例如,头发的颜色,身高,体重等),如您所知,将在表上重复显示(头发的颜色=黑色,或体重= 75 kg )。
与此同时countryid和cityid配置为上更新外键和DELETE CASCADE。
搜索将基于cityid和A列。 下拉菜单选择城市(因此为cityid ),并在文本框中插入特征A ,然后单击SEARCH按钮。
我的问题是:
在“ 用户”表上,我在同一列(列B,C,D和E )中重复了数据。 这是针对2NF的 。 我是否必须为每个列创建一个单独的表,然后将每个表的外键分配给Users表才能实现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和A搜索进行搜索后才显示它们。 如果(将来)我决定我需要显示居住在cityid中并且有黑发的Users的所有结果,那么在设计数据库时我现在要记住什么?
一方面,我们拥有DML(INSERT,UPDATE,DELETE),另一方面,我们拥有查询(SELECT)。 DML在规范化的DB上运行更快,而在非规范化的DB上查询则更快。 有中间解决方案吗?
上面创建的UNIQUE INDEX是否足以确保cityid和A列中数据组合的唯一性? 我是否需要使用JavaScript或更好的PHP进一步限制它?
多个查询VS连接 :规范化数据库将需要多个查询或带有连接的单个查询。 在“用户从马德里搜索具有特征A的用户”的情况下:
a) 多个查询:
i)转到“ 城市”表并找到马德里的ID(例如id = 2)
ii)给定马德里ID和特征A的输入,转到用户表,然后从用户所在城市选择SELECT * FROM cityid =“ 2” AND A =“ characteristic”;
b)内部联接:
i) SELECT City.city_name, Users.B, Users.C FROM City INNER JOIN Users ON Users.cityid = City.id;
我应该选哪一个?
提前致谢。
您的表已经在2NF中.2NF的条件是应该不存在部分依赖关系。例如让您的users
表和user-id
是主键,另一个更适合调用candidate key
主candidate key
是(cityid,A)
如果仅cityid或A足以唯一地检索B,C,D或E,但您需要同时使用两个(cityid,A)
来检索一个唯一记录,因此已经标准化。
注意:
您的表不在3NF中.3NF的条件不具有传递依赖关系。让我们在此处使用users表是主键,您可以获得一个唯一的(cityid,A)对,进而可以得到一个唯一的( B,C,D,E)记录,其中(cityid,A)是从userid获得的。简而言之,如果A-> B和B-> C间接是A-> C,这称为传递依赖项,并且它存在于您的用户表中,因此它不是3NF的合适候选人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.