【问题标题】:Change of a database design更改数据库设计
【发布时间】:2017-10-25 23:17:23
【问题描述】:

我的数据库的某些表的设计存在问题。问题是:

我有 2 张桌子:

Level
   Id (PK)
   Name

Union
   Id (PK)
   LevelId (FK)
   CityId (FK)
   PostalCodeId (FK)
   CountryId (FK)

实际上,我有 3 个级别,ID 分别为 1、2 和 3。在并集表中,我只能有 1 个 FK 标记和 1 个级别。例如,ID 为 1 的 Level 始终与 City 相关联,因此 LevelId 字段将填充 1,CityId 将填充其对应的标识符(其他字段将为空)。 LevelId 2 和 PostalCodeId(其他字段将为空)和 LevelId 3 和 CountryId。

现在,我想同时引用现在的 CityId 和 PostalCodeId,但是它们有不同的级别(并且级别表不应该改变,因为是大师)。

您认为解决此问题的最佳方法是什么?我想到了 2 个解决方案:

1) 去掉Union表的Level列,后台控制填充参数的个数。但是如果 Union 中的列数(FK)增加,我需要控制这么多条件。而且可能效率低下。

2) 使用代表“新关卡”的 ID 创建另一个关卡。我认为这不是最好的解决方案,因为事实上,我只有 3 个真实关卡。另一个是混合关卡,高手不会是这样的高手。

我不知道是否有更好的解决方案,或者如果没有,最好的方法是什么。

提前致谢。

【问题讨论】:

  • 我完全不明白你想在这里做什么。您可以发布表格的实际 ddl 而不是伪代码吗?对我来说,这似乎有点不对劲,但我对问题的理解不足以帮助解决它。
  • 调用表 UNION 是个糟糕的主意。
  • 您的表格应该代表您正在建模的业务/系统中的真实“事物”。如果没有对这些信息的深入了解,没有人可以安全地提供建议。你有一个猜测 - 这可能会或可能不会有帮助。可以说,这似乎是错误的做法。重来。如果您需要帮助,请讨论您的模型及其代表什么以及如何使用它。

标签: sql sql-server database database-design


【解决方案1】:

您的问题在于混合概念,因此您在关系数据库的 ACID 规范中缺少 A(原子性)。

您应该为城市、邮政编码和国家/地区创建一个单独的表。如果您愿意,因为它们是相关的,您可以参考邮政编码所属的城市,以及该城市所属的国家/地区。

所有 Id 字段都是主键:

级别(ID、名称)

国家(id,level_id(fk),名称)

城市(Id,level_id(fk),country_id(FK),name)

邮政编码(Id, level_id (fk), city_id (FK), name)

如果它有助于某些搜索,您还可以在 PostalCode 表中添加 country_id,但它是多余的,因为您可以通过 FK city_id 和 country_id 获得它。

不确定这是否有助于解决您的问题,如果您需要更多信息,请提供一些完整示例(每个表格中包含示例数据)。

编辑: 如果对您更有利,您还可以构建一个自引用表来执行相同的操作:

联合表

Id 级别 country_id city_id 名称

1 3 0 0 英国

2 2 0 0 伦敦

3 1 2 2 YX-223

country_id 引用 union_table.Id,city_id 也引用 union_table.Id。然后,级别确定它是邮政编码 (1)、城市 (2) 还是国家 (3)。 country_id 和 city_id 都不是外键,但应该被索引。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 2012-05-18
    • 2021-12-03
    • 2011-09-24
    • 2013-12-08
    • 2011-08-05
    • 2011-03-03
    • 2016-11-26
    相关资源
    最近更新 更多