0
我正在嘗試爲我的一個小項目創建數據庫模式,並且遇到了一些障礙。我想要一個設置表來存儲我的不同設置。我的問題是設置可以有不同的數據類型:int,varchar,bool,datetime。可以具有不同數據類型的設置類型表的數據庫模式
最簡單的解決方案是使所有的varchar,但我想問是否有其他設計方案可以採取。
我正在嘗試爲我的一個小項目創建數據庫模式,並且遇到了一些障礙。我想要一個設置表來存儲我的不同設置。我的問題是設置可以有不同的數據類型:int,varchar,bool,datetime。可以具有不同數據類型的設置類型表的數據庫模式
最簡單的解決方案是使所有的varchar,但我想問是否有其他設計方案可以採取。
如果你想在數據庫中存儲適當類型的數據,這樣數據不會被破壞,特別是敏感的東西,如小數點,這可能會導致問題。
我在過去所做的是創建一個表,其中包含設置名稱,數據類型以及每個相關類型的值列。然後在UDF或應用程序代碼中使用右列動態獲取/設置它。
例如:
create table settings (
id int identity(1,1) primary key,
name sysname not null,
value_type varchar(20) not null,
int_value int not null default 0,
decimal_value decimal(10,2) not null default 0,
bool_value bit not null default 0,
string_value nvarchar(max) null
)
create unique index IX_settings on settings (name);
go
create function dbo.GetSetting(@name sysname) returns sql_variant as
begin;
declare @retval sql_variant;
select
@retval = case value_type
when 'int' then int_value
when 'bool' then bool_value
when 'string' then string_value
when 'decimal' then decimal_value
end
from settings
where name = @name;
return @retval;
end;
go
insert into settings (name, value_type, int_value) values ('limit', 'int', 10);
insert into settings (name, value_type, bool_value) values ('enabled', 'bool', 1);
insert into settings (name, value_type, decimal_value) values ('rate', 'decimal', 9884.45);
select dbo.GetSetting('limit'), dbo.GetSetting('enabled'), dbo.GetSetting('rate')
至於寫入數據,你可以做到這一點與存儲過程或在應用程序代碼。
你考慮過sql_variant嗎? –
@DanGuzman:我希望能夠將它們存儲在它們的實際數據類型中,即使這意味着要添加更多的表。 –
你可以有一個XML列;這將允許在將來進行簡單的更改,以添加不同數據類型的不同設置,或者存儲某些列的某些設置值以及其他列的其他設置值。 –