我和一位朋友正在开发一个数据库,用于存储有关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来将与单个帐户关联的数据添加到三个单独的表中,因为所有主键都会自动递增,除此之外,没有任何键是唯一的。帐户可以让您轻松更新现有数据。
很抱歉,如果这一切都没有意义
答案 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"我应该在什么时候创建一个单独的表?"是一个复杂答案的基本问题,需要学习一些东西。)