[英]mysql - store typically/mostly NULL columns in one table or create 1:1 relationship?
运行Mysql Server版本:5.7.27-0ubuntu0.18.04.1
我正在创建一个网站/应用,其中用户“提交”可以是以下之一:
我在两种设计之间做出选择时遇到了麻烦(为简洁起见,简称)。
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
,包括NULL
或NOT NULL
,每个表的PRIMARY KEY
以及任何辅助索引。
SubmitComments到VARCHAR(500)而不是TEXT中?
TEXT
。 回到主要问题。 您的示例中有几列全为NULL或全部为空。因此,我倾向于使用2个表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.