我的问题很简单,目前,我有一个数据库,其中包含一个“用户”表,其中包含有关每个用户的重要信息(电子邮件,用户名,密码),一个“身份”表中包含名字,姓氏,生日...用户名和“媒体”表,该表当前包含“ facebook”,“ googlePlus”,“ twitter”,“ youtube”等字段...实际上是该用户所有媒体的地址。
但是,我的问题是:如果我将表“ Medias”缩小为2个字段:“ address”,“ type”(和“ user_id”),并且类型可以为“ twitter”,“ facebook”,也许数据库会得到更好的设计“ ...
如果我有数百个用户,什么是最佳方法?在速度和内存使用方面?
经典的狭义之争。让我们来看看您当前的设计。您有一个带有user_id的宽表,以及用于社交媒体链接的其他四列。也许是这样的:
medias
user_id int
twitter varchar
google_plus varchar
如果varchar列可为空,则存储处于最佳状态。如果您的用户没有Twitter帐户,但拥有Google帐户,则只有google_plus列会包含数据。其他为null,并且varchar
null字段不占用任何存储空间。
现在让我们看一下狭窄的设计
medias
user_id
media_type
link
它具有三列,但始终会被填充。您打算用'twitter','google'等填充media_type。因此,这意味着您要使用的存储空间要比广泛的设计要多。如果用户有两个社交媒体帐户,则user_id将存储两次。您可以通过使用常量来减少这一点。
twitter=1
google_plus=2
yahoo=3
将这些数字存储在media_type列中。这样该字段可以smallint
占用很少的空间。如果您期望使用大量的媒体帐户,则不能使用这样的常数,但是需要为它们创建一个单独的表,并在此常数中仅输入您的ID。
具有广泛的设计,并希望了解有多少用户拥有一个Google帐户或一个Twitter帐户?现在,您需要在twitter和google_plus列上都建立一个索引,这些索引将变得非常大。与索引的大小相比,通过存储空值保存的内容将非常小。(可以通过仅索引部分列来克服)
尝试这样的事情:找出有多少用户至少拥有三个社交媒体帐户。这是一个很难处理的宽表查询,不是吗?但是桌子狭窄却很容易。
另一方面,狭窄的表猜测只有media_type列需要索引的内容,而这是一个很小的索引。如果执行这种查询,则肯定要使用狭窄的表。
假设Yahoo倒闭了,您想在宽表中删除该列,对吗?曾经尝试过在具有100万行的表格上放置一列吗?您键入alter table命令,出去吃午餐,当您回来时,您会发现它仍在运行,并且您的网站没有响应。
假设另一家社交媒体公司开始运营并接管了facebook。尝试添加一列。与上述相同的结果
最后,对于几百行来说,所有这些都不是真正重要的事情,但是,开始实践使用正确设计的做法总是一个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句