一个表有多个字段或两个表,字段较少?

时间:2016-08-18 00:37:03

标签: php mysql sql database optimization

我的问题很简单,目前,我有一个带有“用户”表的数据库,其中包含有关每个用户的重要信息(电子邮件,用户名,密码),一个包含名字,姓氏,用户的生日...和“媒体”表格,目前包含“facebook”,“googlePlus”,“twitter”,“youtube”等字段,实际上是用户所有媒体的地址。

但是,我的问题是:如果我将表格“Medias”缩小为2个字段,可能会更好地设计数据库:“adress”,“type”(和“user_id”),类型可能是“twitter” ,“facebook”......

如果我有数百名用户,最佳方法是什么?在速度和RAM使用方面?

3 个答案:

答案 0 :(得分:2)

经典的狭隘与广泛的争论。让我们采用您当前的设计。您有一个包含user_id的宽表和另外四个用于社交媒体链接的列。也许是这样的:

数据

medias
  user_id int
  twitter varchar
  google_plus varchar

如果varchar列可以为空,那么您的存储是最佳的。如果您的用户没有Twitter帐户但只有Google帐户,则google_plus列会包含数据。其他为空,varchar空字段不占用任何存储空间。

现在让我们来看看狭窄的设计

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列,这是一个非常小的索引。如果你做这种查询,你肯定想要一个狭窄的表。

其他考虑因素

假设雅虎破产,您可能希望将该列放在宽表中吗?有没有试过在一百万行的桌子上放一列?您键入alter table命令,外出吃午餐,当您回来时,您会发现它仍在运行且您的网站没有响应。

假设另一家社交媒体公司启动并结束了Facebook。尝试添加一列。与上述

的结果相同

最后,对于数百行而言,这一切都不重要,但进入使用正确设计的做法总是一个好主意。

答案 1 :(得分:1)

你可以采取任何一种方式,这只是一个偏好问题。就性能而言,它可能可以忽略不计,但我认为一张桌子上的所有内容都是最有效的。您可能希望创建一个包含以下列的媒体表:

UserID,MediaName,MediaValue

1,google,whoever @ google.com

1,youtube,youtube / mychannel

如果您有用户,只需为用户添加媒体,这可能会更具可扩展性。

答案 2 :(得分:-3)

我建议使用3-9列的许多表。一切都取决于你想要的。 任何或多或少都会无效,因为访问表并从中读取它会耗费时间。 桌子越重,装载的时间越长。 根据您要保存的内容,找到要使用的最佳和有效列数,例如,与将所有内容保存在一个表中相比,为每个类别创建表格会非常好。 速度和友善。 RAM和处理能力取决于您的流量和PHP计算,如果复杂,并且只应在您处理数千或数百万用户时才重要。 一切顺利