当前位置: 首页 > 知识库问答 >
问题:

对于1对1关系,什么在性能上更好:一个新表还是一个带有大量空条目的VARCHAR列

黄向明
2023-03-14

如果a添加了一个新列,就会有空条目,所以我想知道当数据类型为varchar时,这有多有害。

因此具体地说,我有一个“messages”表,其中存储了从userA到userB的消息。每个用户都应该有机会对给定的消息进行一次响应,这样我就可以在现有的messages表中添加一个带有VARCHAR的“response”列,或者创建一个带有“index_message”和“response”列的新表“response”。

什么更好?

编辑:

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sender` int(10) unsigned NOT NULL,
  `receiver` int(10) unsigned NOT NULL,
  `message` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ref` varchar(180) COLLATE utf8_unicode_ci DEFAULT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '0',
  `type` tinyint(4) NOT NULL,
  `multiple` tinyint(4) NOT NULL DEFAULT '0',
  `timestamp` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `responses` (
  `msg_id` int(10) unsigned NOT NULL,
  `response` varchar(140) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`msg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

共有1个答案

鲁滨海
2023-03-14

这完全取决于您的需要或流程。

如果您只允许用户对一条消息响应一次,那么就只使用一个表。

CREATE TABLE `messages` (
  columns go here.....
) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

如果您允许用户对一条消息进行多次响应,因为可能会出现后续操作,那么就使用多表关系。

CREATE TABLE `messages` (
  columns go here...
) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `responses` (
  msg_id, response, sender....
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `messages` (
  id, title, to, from, message/response, date, msg_id....
) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 类似资料:
  • 我使用的是PlayFramework 2.3,我有以下类: MyEntity.java: Version.java 当我想为实体创建一个新版本时,我通过分离复制它,将id设置为0,并按如下方式持久化: 如果我使用下面的代码,它工作正常(第一个代码) 我不太喜欢这个代码,因为我可以像这样使用它(第二个代码) 但如果我这样做,外键不会在“实体”表中更新,我不知道为什么。有人能告诉我克隆的两种实现方式有

  • 假设我有一个名为的类,并且创建了一个新的空对象: 中的构造函数是: 、和是否等于空? 如果不是,有没有办法让我创建对象,使所有三个实例变量都是?

  • 这是一位高级经理问的面试问题。 哪个更快? 我说过,这两者具有相同的执行速度,因为内部的表达式最终应计算为或。在这种情况下,两者的计算结果都为,条件中没有额外的条件指令。因此,两者的执行速度相同,我更喜欢while(1)。 但面试官自信地说:“检查一下你的基础,比要快。”(他不是在考验我的信心) 这是真的吗?

  • 给定: 表A~400k行表B~150k行 两个表都有相同的GUID,但我需要在A中标记B中所有缺少的GUID,这两个GUID都有索引。 查询: 这个查询可以工作,但在我的机器上花了4、5个小时。有什么方法可以让这个查询运行得更快吗?

  • 问题内容: 要创建一个新的Integer对象,该对象在Java 1中保存值,以下其中一项是正确的,并且以下方法的区别到底是什么,因为所有方法都将打印该值? 方法1: 方法2: 方法3: 使用方法三,我得到以下警告: 问题答案: 您跳过了预期的解决方案: 此模式称为Factory方法模式。有人可能会问这种方法有什么好处。幸运的是,class的实现是开源的,因此让我们看一下: 似乎存在某种-value

  • 我想要一个数据结构来支持这些特定的1: N关系:- 1#。提高0-N 2#。有0-N 3#。培育0-N 4#。是0-N的房子。 注: -这些关系中的状态都是暂时的,例如可能会提升,但一年后,可能会放弃 -所有对象都继承自,并且具有唯一的int-ID。 在所有上述关系中,我希望能够支持这些功能:- F1。添加关系,例如