如何在sql中建模'toggle'表

时间:2012-04-10 09:56:09

标签: sql database-design

我有一些包含一些列的表

CREATE TABLE test (
testid INT,
field1 CHAR(10),
field2 VARCHAR(50),    
field3 DATETIME,    
field4 MEDIUMINT
[...]
);

现在我希望能够在我的应用中设置一个设置,允许我为特定用户启用或禁用其中一些设置。

CREATE TABLE user (
userid INT
);

我在考虑:

CREATE TABLE user_test_visible (
userid INT,
field1 BOOL,
field2 BOOL,
field3 BOOL,
field4 BOOL
[...]
);

我也在考虑这样的事情:

CREATE TABLE user_test_visible (
userid INT,
field_name VARCHAR(30),
visible BOOL);

这些方法中哪些都合情合理?

2 个答案:

答案 0 :(得分:1)

我建议做这样的事情。

CREATE TABLE test 
(
    fieldId INT,
    field CHAR(10)
)

要有一个包含字段的表。然后,如果您需要再添加一个(更改要求),则无需添加新列。

我会跳过布尔值并使用一个具有共享主键的表。像这样:

CREATE TABLE user_test_visible (
    userid INT,
    fieldId INT
);

我建议跳过布尔值的原因是,如果没有行,请显示该字段。这取决于你的起始价值。如果您希望用户从开头看到所有字段,那么您可以考虑使用这样的表:

CREATE TABLE user_test_not_visible (
    userid INT,
    fieldId INT
);

然后,此表中有一行,则不显示该字段。

修改

使用时插入字段,你必须有一些预部署脚本吗?在那里,您还可以指定哪些列可见,哪些列不可见。如果您有不同的数据类型,则ether具有您所拥有的布局,或者您只能使用sql_variant。但是海狸说,例如linq-to-sql不支持这种类型的列作为主键。

这只是我的身份。希望它有所帮助

答案 1 :(得分:0)

也许更灵活的方法是在应用程序中定义“角色”。用户将与一个或多个角色相关联,并且每个角色将与一组列相关联。这些列集的并集将是用户可以看到的。这种方法需要更多努力才能确定用户可以看到的列,但从长远来看,这将使用户管理变得更容易。它还将用户权限与数据库访问权限区分开来。