php - 一张表多字段还是两表少字段?

标签 php mysql sql database optimization

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

但是,我的问题是:如果我将表“Medias”减少为 2 个字段:“address”、“type”(和“user_id”),并且类型可以是“twitter”,也许数据库的设计会更好, " Facebook "...

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

最佳答案

经典的狭隘与广泛辩论。让我们以您当前的设计为例。您有一个宽表,其中包含 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。

索引

拥有广泛的设计并想了解有多少用户拥有谷歌帐户或推特帐户?现在您需要在 twitter 和 google_plus 列上建立索引,这些索引将非常大。与索引的大小相比,您通过存储空值保存的内容将非常小。 (可以通过仅索引部分列来克服)

尝试这样的事情:找出有多少用户至少拥有三个社交媒体帐户。这是一个宽表的艰难查询,不是吗?但是非常简单, table 很窄。

另一方面,窄表猜测只有 media_type 列需要索引,这是一个非常小的索引。如果你做这种查询,你肯定想要一个窄表。

其他注意事项

假设 Yahoo 倒闭,您会想在宽表中删除该列,对吗?是否曾尝试在具有 100 万行的表中删除一列?您键入 alter table 命令,出去吃午饭,当您回来时,您会发现它仍在运行并且您的网站没有响应。

假设另一家社交媒体公司成立并接管了 Facebook。尝试添加一列。与上面相同的结果

最后,对于只有数百行来说,这些都不重要,但开始使用正确的设计实践总是一个好主意。

关于php - 一张表多字段还是两表少字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39008245/

相关文章:

php - 将此字符串:“ab1_cd2_ef3.php”转换为3个变量:“ab1”,“cd2”和“ef3”?

php - 删除数据库中的记录

java - 如何使用 JQuery + Ajax 发送将由 RestFulServices 使用的 JSON 对象数据?

php - 检索数据库表中具有特定值的最新条目

sql - 如何对一个模型*不*包含另一个模型的多对多关系进行过滤?

php - 在 function.php 中使用时,Woocommerce 产品数量返回错误

javascript - 在php中调用js函数

php - SQL:不存在的地方 - 仅在不存在时插入

c++ - 无法通过 odbc 连接到 Microsoft Azure 数据库

sql - Rails 查找关联的 has_many 记录为零的记录