在数据库表中建模“默认”行的正确方法是什么

时间:2015-07-07 13:41:09

标签: sql sql-server database database-design

==情景==

我们有一个普通的普通国家表。

正在提出一些新表,它们将保存代表各种设置的行。

设置表需要FK到国家/地区,因为许多设置都是针对特定国家/地区的。

但是,某些设置被视为默认设置 - 因此,并非所有设置都是特定于国家/地区的。您可以将它们视为全局设置或后备设置。

一个这样的表可能看起来像这样:

 WidgetSettings
 -------------
 (PK, FK) widgetsetting_code char(8) not NULL
 (PK, FK) country_code char(2) not NULL
 SettingValue int not NULL

到目前为止提出了一些想法:

(1)“表示country_code为NULL的默认设置。”

No-can-do:country_code参与PK,所以我们无法使用NULL。

(2)“在我们的国家/地区表格中引入虚拟默认”全球“国家/地区。

嗯,这对我来说似乎是错的,为此目的污染了我们国家的表格。有没有人认为这是一个好习惯?

[编辑]为了扩大这一点,其他表格目前指向国家,他们需要继续指向真正的国家代码,而不是偶然指向“全​​球”。

(3)“制作一种区域索引视图,将所有国家和全局行联合起来。”

这就是我们现在所处的位置,但由于此处无法实现FK禁令,我们采用触发器强制执行。对此不太满意,特别是如果可以找到可以让我们使用适当的FK约束的替代建模。

(4)“制作一种包含所有国家和全局行的区域超级表。”

考虑转向此但不喜欢它引入的维护问题,以使其与真实国家/地区表保持同步。

我只是有一种唠叨的感觉,有一种更好的方式来代表我们忽略的。

3 个答案:

答案 0 :(得分:1)

如果这些设置表本身不是任何外键引用的目标 1 ,我选择NULL路由。我们仍然可以对表格强制执行关键约束,只使用UNIQUE约束而不是PRIMARY KEY约束:

create table WidgetSettings (
    widgetsetting_code char(8) not NULL,
    country_code char(2) NULL,
    SettingValue int not NULL,
    constraint PK_WidgetSettings UNIQUE (widgetsetting,country_code),
    /* TODO - FK constraints */
)

主键约束提升一个键比其他键更重要但是并非每个表都必须拥有一个键(要求表至少有一个是好的,坚持认为它必须有一个主键,用SQL来说,并不是那么绝对好。)

1 这里的问题是SQL Server不会强制引用 全局设置值,因为 any <{1}}中的NULL / em>外键列允许不检查约束。

答案 1 :(得分:0)

我认为第二种选择很有意义。将新国家称为&#34; world&#34;,&#34; terra&#34;,&#34; earth&#34;,&#34; gaia&#34;等等。

你真的没有#34;国家&#34;表。您有一个支持区域设置的表。您可能会发现大陆作为分组很有用。或语言领域。或时区。或货币区。我认为你对#34; country&#34;。

的定义过于严格

答案 2 :(得分:0)

所以基本结构应该是这样的: -

Country -----> CountryXpreference -------> Preference

在结构中,选择是填写CountryXprefernce关系表中的所有可能的排列。

或定义一个特殊的&#34;无处不在&#34; CountryXPreference中具有默认首选项的国家/地区,仅定义CountryXpreference中的&#34; real&#34;国家。

我个人会选择第一个选项,因为经验告诉我,从长远来看,会有比默认更多的例外情况。同样保持这一点并不是那么难,你有200多个国家,所以只需用默认值填充所有内容,让你的业务用户登录并更新需要例外的国家。

当你得到一个新国家时,你可以做一些简单的SQL来复制最相似的国家。