2017-02-01 20 views
0

我正在嘗試爲我的一個小項目創建數據庫模式,並且遇到了一些障礙。我想要一個設置表來存儲我的不同設置。我的問題是設置可以有不同的數據類型:int,varchar,bool,datetime。可以具有不同數據類型的設置類型表的數據庫模式

最簡單的解決方案是使所有的varchar,但我想問是否有其他設計方案可以採取。

+0

你考慮過sql_variant嗎? –

+0

@DanGuzman:我希望能夠將它們存儲在它們的實際數據類型中,即使這意味着要添加更多的表。 –

+0

你可以有一個XML列;這將允許在將來進行簡單的更改,以添加不同數據類型的不同設置,或者存儲某些列的某些設置值以及其他列的其他設置值。 –

回答

0

如果你想在數據庫中存儲適當類型的數據,這樣數據不會被破壞,特別是敏感的東西,如小數點,這可能會導致問題。

我在過去所做的是創建一個表,其中包含設置名稱,數據類型以及每個相關類型的值列。然後在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') 

至於寫入數據,你可以做到這一點與存儲過程或在應用程序代碼。

相關問題