繁体   English   中英

mysql-在一个表中存储通常/通常为NULL列还是创建1:1关系?

[英]mysql - store typically/mostly NULL columns in one table or create 1:1 relationship?

运行Mysql Server版本:5.7.27-0ubuntu0.18.04.1

我正在创建一个网站/应用,其中用户“提交”可以是以下之一:

  1. 文字评论
  2. 图片/文件上传
  3. 视频/文件上传(技术上与#2大致相同,只是MIME类型不同)

我在两种设计之间做出选择时遇到了麻烦(为简洁起见,简称)。

CREATE TABLE submissions
(
    submissionID            INT,
    userID                  INT,
    submissionComments      TEXT,
    fileDirectory           VARCHAR2(32), -- starting here these are only used 20% of time
    fileName                VARCHAR2(128)
    fileMimeType            VARCHAR2(128),
    fileSize                INT,
    originalFileName        VARCHAR2(64)
)

-要么-

CREATE TABLE submissions
(
    submissionID            INT,
    userID                  INT,
    submissionComments      TEXT
)

CREATE TABLE submissionFiles
(
    submissionFileID        INT,
    submissionID            INT, -- FK to submissions table
    fileDirectory           VARCHAR2(32),
    fileName                VARCHAR2(128),
    fileMimeType            VARCHAR2(128),
    fileSize                INT,
    originalFileName        VARCHAR2(64)    
)

我假设文字评论可能占提交的70-80%。

因此,问题就变成了,使用单个表并在fileDirectory / fileName / fileMimeType / fileSize / originalFileName中具有一堆NULL值是否更好? 或者,上传文件时最好采用1:1关系来支持。 在这种情况下,我将同时创建一个submitting和submittingFiles记录。 显然,大多数查询将要求将两个表连接在一起。

从本质上讲,这归因于他们对多数为NULL的表中的VARCHAR(和1 INT)列的影响没有很好的了解。 考虑到这是一个全新的网站/应用程序,我可能在这里进行了一些优化,但我正在尝试进行规划。

后来添加的第二个问题(在我键入此内容时),我看到TEXT能够处理:65535个字符或64 KB。 对于一般用户要提交的内容来说,这似乎很多(可能少于500个字符)。 它将很快耗尽存储空间。 将SubmitComments放入VARCHAR(500)而不是TEXT会产生影响吗? 我假设如果有的话,除了能够存储“更少”之外,没有其他不利的取舍。

谢谢!

编辑:正如madhur所指出的,关于“设计模式”也有类似的问题/很好的答案。 我更关心性能。 大量varchar的存在是否会对数据存储/检索产生负面影响(通过弄乱mysql实现页面/范围/等的方式)?

无论哪种方式,我都建立了架构。 在某种程度上,这并不重要。 但是您可能会发现某些查询以一种方式( 或另一种方式 )更快。 磁盘使用情况大致相同。

您的第二个选项允许(因此暗示)每个“提交”有多个“文件”。 对于这种“许多:1”关系,必须使用2个表。

另一方面,如果每个“提交”中只能有一个“文件”,则您不需要submissionFileID (我以为是PRIMARY KEY ??),而是为此使用PRIMARY KEY(submissionID)第二张桌子。

如果您想进一步讨论,请提供完整的CREATE TABLE ,包括NULLNOT NULL ,每个表的PRIMARY KEY以及任何辅助索引。

SubmitComments到VARCHAR(500)而不是TEXT中?

  • 没有存储差异。
  • 没有速度差。
  • 前者将截断,并给出500个字符的警告或错误; 后者将截断为65535字节。 我只会使用TEXT

回到主要问题。 您的示例中有几列全为NULL或全部为空。因此,我倾向于使用2个表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM