4

我有一个问题,在更快、更好且面向未来的 T-SQL 设置中?

拥有一个带有 ID 和状态条目的查找表是否更容易?

ID | Status
-------------
01 | Success
02 | Failure
03 | Processing

还是只在每行中输入状态值更好?

这对编写查询有何影响,使用查找表而不是仅仅在行中输入状态是否是良好的关系数据库设计?一个比另一个快吗?

我觉得查找表是要走的路,但在某些数据库中我看不到这么多。

4

5 回答 5

3

我个人会为这些项目使用单独的状态表。然后,您将在主表和单独的状态表之间使用外键。至于查询,您只需使用 aJOIN来包含实际状态名称。

SELECT *
FROM yourTable t
LEFT JOIN yourStatus s
    t.sid = s.id

我认为它允许更大的灵活性,如果您的状态名称发生更改,您只需更改单独表中的值,而不是UPDATE对您的主表执行。

您的表结构可能与此类似:

MainTable
id int PK,
sid int FK - to status table
col3,
col4...

Status Table
id int PK - 
name varchar(50)
IsActive bit
于 2012-08-06T13:53:23.327 回答
2

没有更好的方法可以做到这一点。这取决于您的业务逻辑和您存储的数据量。

通常建议使用锁定表,因为您可以避免重复数据,并且如果您只想加载状态值(没有重复),它会更快。想象一下,您想创建一个带有状态值的下拉列表。你只需要做一个

select * from lockup_table. 

然后你想选择状态为处理的行

SELECT *FROM table t
LEFT JOIN lockup_table lt ON t.sid = lt.id 
WHERE lt.status LIKE 'Processing'

它也会保持很快,因为您的 SGBD 将使用 pk 索引的强大功能。

但有时最好有重复数据,避免连接操作。如果您注意到连接操作需要一段时间,您应该尝试删除锁定表,看看您的性能是否因这些更改而得到改善。您也可以为该列创建索引。它会提高性能。

总之,如果您想要一个具有静态值(成功、处理、失败)的状态列,则不需要锁定表。但是,如果您想要具有动态值的无限范围的值,以便明天可以添加更多状态值等,您应该创建一个锁定表。

于 2012-08-06T14:32:38.937 回答
1

我认为拥有 ID 并将其用作表中的外键总是更好。我认为这是最面向未来的解决方案。对于这种情况,特别是如果你想按状态过滤,它可以加快思考,因为它不会比较字符串。

您也可以将此状态表用于数据库中的其他表,并且更容易交叉数据。

而且更容易索引。

所以在我看来,我认为这是要走的路。

干杯

于 2012-08-06T13:51:54.403 回答
0

使用查找表不符合条件的清单

  1. 用户会想要修改这个列表吗?
  2. 此列表是否超过 10 项?
  3. 您希望此列表在未来扩大吗?
  4. 它是否有两个以上依赖于 ID/CODE/PK 的列?

如果其中任何一个的答案是“是”,请创建一个表并将 PK 用作主表中的 FK。这是你唯一应该做的事情!

否则,如果列表是有限的并且表示最小的状态代码,则选择枚举类型。

于 2020-11-07T02:11:58.427 回答
-1

就个人而言,我使用状态表,但主键不是 int,而是 varchar(6)。这使得运行临时报告变得容易,同时确保状态字段不是自由格式的。

我的状态表通常有以下字段:

create table foo_status (
    status      varchar(6) primary key,
    active      bit,
    name        nvarchar(255),
    description ntext null
);

并且数据表通过外键引用它

create table foo (
    ...
    status varchar(6) foreign key references foo_status(status)
    ...
);
create clustered index foo_fk_status_index on foo(status);
于 2012-08-06T13:53:27.867 回答