我有一个问题,在T-SQL设置中哪个更快,更好,面向未来?
是否更容易拥有包含ID和状态条目的查找表
ID | Status
-------------
01 | Success
02 | Failure
03 | Processing
或者,最好只输入每行的状态值吗?
这对编写查询有何影响,使用查找表而不仅仅是将状态输入行是否是良好的关系数据库设计?一个比另一个快吗?
我觉得查找表是可行的方法,但我在某些数据库中看不到这么多。
答案 0 :(得分:3)
我个人会为这些项目使用单独的状态表。然后,您将在主表和单独的状态表之间使用外键。至于查询,您只需使用JOIN
来包含实际的状态名称。
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
答案 1 :(得分: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索引的力量。
但有时最好有重复数据,避免连接操作。如果您认为联接操作需要一段时间,则应尝试删除锁定表,并查看您的性能是否随着更改而得到改善。您也可以为该列创建索引。它会提高性能。
总之,如果您希望状态列具有静态值(成功,处理,失败),则不需要锁定表。但是如果你想要一个具有动态值的无限范围值,那么你明天就可以添加更多的状态值等,你应该创建一个锁定表。
答案 2 :(得分:1)
我认为拥有ID并将其用作表中的外键总是更好。我认为这是最具前瞻性的解决方案。对于这种情况,特别是如果你想按状态过滤,它可以加速思考,因为它不会比较字符串。
此外,您可以将此状态表用于数据库中的其他表,并且更容易跨数据。
索引更容易。
所以在我看来,我认为这是要走的路。
干杯
答案 3 :(得分:0)
就个人而言,我使用状态表,但主键不是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);
答案 4 :(得分:0)
清单不符合使用查找表的条件
如果任何一个答案为“是”,则创建一个表并将PK用作主表中的FK。这是您唯一要做的事情!
否则,如果列表是有限的并且代表最少的状态代码,请使用枚举类型。