使用字符串作为表键并将其拆分为两个表之间的效率

时间:2012-01-20 02:10:00

标签: sql relational-database

我正在考虑使用字符串作为数据库表中的键来提高效率。我在我的应用程序中有一个名为Command的抽象类,它有一个硬编码到派生类中的命令键,例如" CREATE_ADMIN_USER"或" DELETE_NEWS_POST"。

我想在数据库中存储一些配置,例如哪些角色可以执行这些命令。

什么会更有效:

CommandKey        | Role
--------------------------
CREATE_ADMIN_USER | GodUser
DELETE_NEWS_POST  | Admin
DELETE_NEWS_POST  | Editor

OR

ID| CommandKey
--------------------------
1 | CREATE_ADMIN_USER
2 | DELETE_NEWS_POST

ID | Role
--------------------------
1  | GodUser
2  | Admin
3  | Editor

CommandKeyID | RoleId
---------------------
1            | 1
2            | 2
2            | 3

在第一个的情况下,缺点是您必须为命令键字符串存储更多字符。如果你有1000多个命令和多个角色,这可能会成为一个空间问题。

第二个问题的缺点是你必须在3个表之间创建连接。

两者之间哪一个更合适(如果实际上有更好的方式):使用更多空间或连接3个表。

1 个答案:

答案 0 :(得分:1)

加入表的主键通常相当便宜。所以我希望第二种方法在大多数DBMS中更有效,但由于你没有指定你正在使用的DBMS,所以很难给出明确的答案。

另外,我认为无论出于何种原因,第二种选择更常用。我可以明确地说,如果您决定更改角色的名称或命令键的字符串,第二个选项将更易于管理。

由于所有这些原因,我建议使用第二种选择。