繁体   English   中英

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

[英]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,DE是用户的某些特征,其中特征A(如果将其与cityid结合使用)必须是唯一的,这就是为什么我为这两列创建了唯一索引的原因:

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

其余的B,C,D和E列是用户的其他特征(例如,头发的颜色,身高,体重等),如您所知,将在表上重复显示(头发的颜色=黑色,或体重= 75 kg )。

与此同时countryidcityid配置为上更新外键和DELETE CASCADE。

搜索将基于cityidA列。 下拉菜单选择城市(因此为cityid ),并在文本框中插入特征A ,然后单击SEARCH按钮。

我的问题是:

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

    表B(id,Bchar)

    表C(id,Cchar)

    表D(id,Dchar)

    表E(id,Echar)

    用户(id, cityidA ,Bid,Cid,Did,Eid)

  2. 目前,我不会将B,C,DE列用作搜索数据,仅在使用cityidA搜索进行搜索后才显示它们。 如果(将来)我决定我需要显示居住在cityid中并且有黑发Users的所有结果,那么在设计数据库时我现在要记住什么?

  3. 一方面,我们拥有DML(INSERT,UPDATE,DELETE),另一方面,我们拥有查询(SELECT)。 DML在规范化的DB上运行更快,而在非规范化的DB上查询则更快。 有中间解决方案吗?

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

  5. 多个查询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 keycandidate 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM