我应该在什么时候创建一个单独的表(mysql)?

时间:2017-09-23 05:28:12

标签: mysql sql

我和一位朋友正在开发一个数据库,用于存储有关cPanel托管帐户的信息,例如每个帐户正在使用的设置,应用和功能。

大多数字段都是布尔值,例如帐户是否有任何wordpress网站,任何php 5.4驱动的网站,rails网站上的任何ruby等等。

少数字段是非布尔数据,例如MB中的磁盘使用情况,帐户所在服务器的主机名,以及帐户的用户名等等。

在我看来,将所有这些信息存储在一个表中是有意义的。

因此该表可能包含以下列:

    php54 boolean,
    wordpress boolean,
    ror boolean,
    username varchar(8),
    hostname varchar(20),
    usage_mb int(9),

我认为主键可以是(用户名,主机名)。

但是,我的朋友已经使用多个表设置了数据库,如下所示:

事实表:

    id int(11),
    php54 boolean,
    wordpress boolean,
    ror boolean,
    usage_mb int(9),

用户表:

    id int(11),
    factid int(11),
    hostid int(11),
    username varchar(8)

主机名表:

    id int(11),
    hostname varchar(20),
    ip varchar(15),

每张桌子的主键是" id"并且用户表使用' hostid'引用主机名表和事实表。和' factid'外键(分别)。

我相信我朋友在多个表背后的理由是根据数据类型组织数据,尽管所有数据都与一个唯一的帐户相关。

我的理由是,由于所有数据都属于一个唯一帐户,因此每一行都是1:1,有多个表是否有意义?

如果一个表中的行可以引用另一个表中的多行,我认为多个表是明智的......但是在这种情况下,每个表中的每一行只能与来自任何其他表的一行相关联。所以我认为一张桌子很好。

这些数据应该在多个表中,还是在一个表中?

当我们走的时候,我们都会把事情弄清楚。

在哪个时候使用多个表是有意义的?

目前很难编写一个API来将与单个帐户关联的数据添加到三个单独的表中,因为所有主键都会自动递增,除此之外,没有任何键是唯一的。帐户可以让您轻松更新现有数据。

很抱歉,如果这一切都没有意义

2 个答案:

答案 0 :(得分:1)

在你的情况下,我不认为拥有一对一关系的多个表是正确的方法。

这不是禁止的,在某些情况下它可能是有帮助的( Is there ever a time where using a database 1:1 relationship makes sense?),但您必须处理请求中不必要的联接。

答案 1 :(得分:0)

忽略id,你发现CK(候选键)是什么以及是否应该分解的方式是更高NF(正常形式)归一化的主题。这标准化了你的概念"一个表中的一行可以引用另一个表中的多行" (其中包括)。在这里猜测使用常识,没有特别需要分解。引入在业务级别不可见的ID在技术上总是不必要的,但是根据其自身的实际/人体工程学原因而发生。进一步的解释/说明是信息建模和数据库设计教科书设计章节,CKs,NFs&代理人 - 读一些。模糊的概念,例如"相同类型的数据"没用。

(TL; DR"我应该在什么时候创建一个单独的表?"是一个复杂答案的基本问题,需要学习一些东西。)