0

我的 2 个数据库表中有一个“状态”列,但每个表的状态类型相同。例如,作者可以具有以下状态:待定、活动、无效、暂停。这些相同的状态类型适用于已发表文章的状态。

仅对 STATUS 下的任一表使用 char() 并输入列出的 4 个状态中的任何一个是否合适,或者为每种状态类型创建一个具有 STATUS_ID 和 STATUS_type 的“STATUS”表是否更有意义,然后只需在表或未来表中使用 STATUS_ID 外键?

简单地输入 4 种类型中的任何一种都是简单的方法,但我认为它们可能是用户错误的可能性......

谢谢

4

6 回答 6

1

您可以使用enum字段数据类型强制一个值必须是一组预选值中的一次。在幕后 MySQL 实际上将这些值存储为整数表示以节省存储需求。

是否需要单独的桌子完全取决于您。如果您认为允许的值集需要随时间动态变化,那么这可能是有意义的(使用外键约束来强制选择其中一个值)。如果这些值实际上代表系统中的某种现实世界对象,这些对象需要有自己的属性(字段)与之关联,那么您也可以从将值放在单独的表中受益。

于 2013-03-26T21:09:45.533 回答
0

一个单独的状态查找表是要走的路。它实际上可能会减慢您的查询速度,因为您正在添加一个连接,但规范化的好处超过了它。最大的实际好处是它使更改状态名称变得更加容易。如果您想将“待处理”更改为“处理中”,您只需更改 1 个字段。

于 2013-03-26T21:09:01.547 回答
0

您是否考虑过在状态列中使用 ENUM 类型?http://dev.mysql.com/doc/refman/5.0/en/enum.html

于 2013-03-26T21:08:10.950 回答
0

最直接的方法是枚举数据类型,第二个表也可以很好地工作,但它更复杂。

于 2013-03-26T21:08:50.203 回答
0

如果您要经常在 WHERE 子句中使用该列,那么最好为它创建另一个表。

于 2013-03-26T21:10:45.673 回答
0

您对状态表的建议是合理的,并且是一种常见的做法。根据您用于编程的语言,枚举将是一个合适的替代方案,这有助于确保只有您定义的枚举类型保存在数据库中。

PHP:

abstract class STATUS
{
    const pending = 1;
    const active = 2;
    const void = 3;
    const suspended = 4;

    function GetConstants()
    {
        $rc = new ReflectionClass($this);
        return $rc->getConstants();
    }
}

C#

public enum CourseType
{
    pending = 1;
    active = 2;
    void = 3;
    suspended = 4;
}
于 2013-03-26T21:12:07.203 回答