除了简单的0或1之外,在MySQL表中保存记录状态的最佳方法是什么?

除了简单的0或1之外,在MySQL表中保存记录状态的最佳方法是什么?,mysql,database,database-design,Mysql,Database,Database Design,如果我有一个充满记录的表,它们可能是付款、预订或其他实体的多方面记录,那么除了简单的0表示非活动记录和1表示活动记录外,是否有保存每个记录状态的最佳实践 例如,付款的状态可能为“待定”、“完成”或“失败”。我以前这样做的方式是,使用另一个表,其中包含一系列值/文本对中的定义,即0='failed',1='pending',2='completed'。然后,我将在payments表中存储0、1或2,并在需要时使用内部联接从definitions表读取文本 这种方法有时似乎过于复杂和不必要,例如,我

如果我有一个充满记录的表,它们可能是付款、预订或其他实体的多方面记录,那么除了简单的0表示非活动记录和1表示活动记录外,是否有保存每个记录状态的最佳实践

例如,付款的状态可能为“待定”、“完成”或“失败”。我以前这样做的方式是,使用另一个表,其中包含一系列值/文本对中的定义,即0='failed',1='pending',2='completed'。然后,我将在payments表中存储0、1或2,并在需要时使用内部联接从definitions表读取文本

这种方法有时似乎过于复杂和不必要,例如,我一直在考虑将我的方法更改为直接在付款表的状态字段中保存“已完成”一词


这被认为是不好的做法吗?如果是,最佳做法是什么?

如果状态不仅仅是开/关布尔类型,那么我总是有一个如您所述的查找表。除了(我相信)更好的规范化设计之外,它还使基于数据实体的对象更易于编码和使用。

这些似乎是事务记录,因此可能存在许多事务记录,查询性能将是一个问题。因此,以这样一种方式组织状态列可能是明智的,即对所需记录的复合索引访问将是直接的

在不了解查询模式的情况下,很难给出清晰的“做这个,不要做那个”建议,因此这里有几个场景

假设您需要获得本月所有的活动预订。您需要对表单进行查询

 SELECT whatever
   FROM xactions
  WHERE active = 1 and type = 2 /*bookings*/
    AND xaction_date >= CURDATE() - INTERVAL DAY(CURDATE()) DAY
这将在
(活动、类型、X操作\ U日期)
上使用复合BTREE索引执行。可以通过随机访问第一条符合条件的记录的索引,然后按顺序扫描它来满足查询

但是,如果type=2表示活动预订,type=12表示非活动预订,并且您希望本月所有预订同时处于活动和非活动状态,那么您的查询将如下所示:

 SELECT whatever
   FROM xactions
  WHERE type IN (2,12)
    AND xaction_date >= CURDATE() - INTERVAL DAY(CURDATE()) DAY
由于(2,12)子句中的
需要不相交的值范围,因此无法如此轻松地扫描复合索引


tl;在MySQL中,为不同的状态项建立单独的列索引更容易,以获得更好的查询性能。但是如果不了解查询模式,就很难知道。对于您提到的特定情况,MySQL支持

在您的示例中,枚举似乎是合适的—它限制了有效选项的范围,在结果中它被翻译回人类可读的文本,并且它创建了易读的代码。它在查询时具有一些性能优势。
但是,请参阅以了解可能的缺点

我不熟悉复合索引,以前也没听说过BTREE这个词。你是说我应该使用定义表方法,但除此之外,状态列也应该声明为索引?是的。你应该仔细阅读复合索引。现在不要担心BTREE;几乎每个MySQL索引都已经是BTREE了。