【发布时间】:2015-10-07 17:47:39
【问题描述】:
我有建议的表结构来扩展数据库:
在OrganisationalAssets 表中。以下列可以为空:
- Organisation_Id
- Location_Id
- Language_Id
我们遇到的问题是Organisation_Id 列仅对某些类型的资产可以为空。有些资产与组织有关,有些则永远不会。对于与组织相关的内容,其他列、位置和语言适用。如果组织为 NULL。那么 Language 和 Location 是这些资产的冗余列。
对我来说,这听起来像是我的表错误地存储了两种类型的资产。内部和外部资产。内部不受组织、语言和位置的限制,而外部资产则受到限制。
但是,我不完全确定如何更改结构以反映这一点。无论它们是内部资产还是外部资产,它们仍然可以有许多与之关联的 AssetSettings。外部资产将具有一组不同的 AssetSettings,具体取决于组织、Location_Id 和 Language_Id,而内部资产则没有。他们每个人都只会有一组设置。
我不确定是否:
- 让结构保持原样,因为它可以工作。虽然它没有正确规范化。
- 尝试重新构建表格以允许两种类型的资产,如果允许,如何实现。
样本数据 以下是一些示例数据,希望能更清楚地说明我的问题:
组织资产
+----+----------+-----------------+-------------+-------------+
| Id | Asset_Id | Organisation_Id | Location_Id | Language_Id |
+----+----------+-----------------+-------------+-------------+
| 1 | 1 | 2 | 3 | 4 |
| 2 | 1 | 2 | 3 | 999 |
| 3 | 2 | NULL | NULL | NULL |
+----+----------+-----------------+-------------+-------------+
前两行是 AssetId 1。它属于两个不同的位置,是一个外部资产。 第三行是内部资产,因此其他列是多余的。
资产设置
+----+------------------------+------+--------+
| Id | OrganisationalAsset_Id | Key | Value |
+----+------------------------+------+--------+
| 1 | 1 | Key1 | Value1 |
| 2 | 1 | Key1 | Value1 |
| 3 | 2 | KeyA | ValueA |
| 4 | 3 | KeyB | ValueB |
+----+------------------------+------+--------+
在 AssetSettings 表中。我们可以看到 Id1 的资产有两个设置(即 OrganisationalAsset_Id 1 和 2)。 我们还可以看到第二个资产出现在表格中,它只能有一组设置,因为它不属于任何组织、位置或语言。
【问题讨论】:
-
我会提出的一个建议是停止在任何表中使用 ID 作为列名。如果它是一个 OrganizationID,它应该是每个表中的那个。 ID 太模棱两可了,而且跨表更改名称的列实在是太糟糕了。
标签: sql sql-server database-normalization