数据库table结构和逻辑

Database table structure and logic

我有一个场景。我有一个属性 table 有很多字段,包括属性大小。 因此,如果某些属性的大小为 5,那么在属性 table 中它将显示 5 但如果用户认为其大小不是 5 而是 6。所以我想处理该用户将其大小保存为 6 但不更改原始值为 5。此外,如果该用户获得该属性记录,它将为该用户显示 6 号,但对于所有其他用户,它将显示 5 号。

任何人都可以帮助我如何在 table 结构或显示用户特定的值中处理这种情况。?我的数据库在 sql 服务器 2012

如果用户在数据库级别是可识别的,您可以按照这些思路做一些事情:

您通常创建 table 加上包含用户自定义的 table:

create table dbo.T (
    ID varchar(19) not null primary key,
    PropertySize int not null
)
go
create table dbo.T_User (
    ID varchar(19) not null,
    [User] sysname not null,
    PropertySize int null
)

然后您创建一个视图,现在应该通过该视图进行所有交互,而不是 table:

create view dbo.V
with schemabinding
as
    select
        t.ID,
        ISNULL(u.PropertySize,t.PropertySize) as PropertySize
    from
        dbo.T t
            left join
        dbo.T_User u
            on
                t.ID = u.ID and
                u.[User] = SUSER_NAME()

然后是一些触发器以确保事情得到适当维护:

create trigger T_V_I on dbo.V instead of insert
as
    insert into dbo.T (ID,PropertySize) select ID,PropertySize from inserted
go
create trigger T_V_U on dbo.V instead of update
as
    merge into dbo.T_User u
    using inserted s
    on u.ID = s.ID
    when matched then update set PropertySize= s.PropertySize
    when not matched then insert (ID,[User],PropertySize) values (s.ID,SUSER_NAME(),s.PropertySize);

所以基本上,每个用户的自定义设置都存储为单独的行,并且基础 table 包含用户将看到的 "default" 值,除非他们应用了自定义设置。

根据所使用的身份验证选项,SUSER_NAME 可能不是正确的函数,但其​​他各种 USER 函数中的一个是正确的。