数据库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
函数中的一个是正确的。
我有一个场景。我有一个属性 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
函数中的一个是正确的。