gpt4 book ai didi

database - 将具有频繁重复字符串值的关系属性分开是否合理?

转载 作者:行者123 更新时间:2023-12-05 08:09:57 24 4
gpt4 key购买 nike

考虑关系SPACESHIP_FLAT:

╔═════╤════════════════╤════════════════╤═══════════╗
║ ID │ NAME │ TYPE │ LV ║
╟─────┼────────────────┼────────────────┼───────────╢
║ 1 │ Soyuz TMA-14 │ Soyuz │ Soyuz-FG ║
║ 2 │ Endeavour │ Space Shuttle │ Shuttle ║
║ 3 │ Soyuz TMA-15M │ Soyuz │ Soyuz-FG ║
║ 4 │ Atlantis │ Space Shuttle │ Shuttle ║
║ 5 │ Soyuz TM-31 │ Soyuz │ Soyuz-U ║
║ 6 │ EFT-1 │ Orion │ Delta-IV ║
║ 7 │ XXX │ CST-100 │ Delta-IV ║
║ 8 │ YYY │ CST-100 │ Falcon-9 ║
║ 9 │ ZZZ │ Dragon V2 │ Falcon-9 ║
║ ... │ ... │ ... │ ... ║
╚═════╧════════════════╧════════════════╧═══════════╝

此处属性 TYPELV 具有重复的字符串值。所以我的问题是:将这些属性转换到新的关系中是否合理?结果将如下所示。

宇宙飞船

╔═════╤════════════════╤═══════╤══════╗
║ ID │ NAME │ TYPE │ LV ║
╟─────┼────────────────┼───────┼──────╢
║ 1 │ Soyuz TMA-14 │ 1 │ 1 ║
║ 2 │ Endeavour │ 2 │ 2 ║
║ 3 │ Soyuz TMA-15M │ 1 │ 1 ║
║ 4 │ Atlantis │ 2 │ 2 ║
║ 5 │ Soyuz TM-31 │ 1 │ 3 ║
║ 6 │ EFT-1 │ 3 │ 4 ║
║ 7 │ XXX │ 4 │ 4 ║
║ 8 │ YYY │ 4 │ 5 ║
║ 9 │ ZZZ │ 5 │ 5 ║
║ ... │ ... │ ... │ ... ║
╚═════╧════════════════╧═══════╧══════╝

SSTYPES

╔═════╤════════════════╗
║ ID │ TYPE ║
╟─────┼────────────────╢
║ 1 │ Soyuz ║
║ 2 │ Space Shuttle ║
║ 3 │ Orion ║
║ 4 │ CST-100 ║
║ 5 │ Dragon V2 ║
║ ... │ ... ║
╚═════╧════════════════╝

车辆

╔═════╤═══════════╗
║ ID │ LV ║
╟─────┼───────────╢
║ 1 │ Soyuz-FG ║
║ 2 │ Shuttle ║
║ 3 │ Soyuz-U ║
║ 4 │ Delta-IV ║
║ 5 │ Falcon-9 ║
║ ... │ ... ║
╚═════╧═══════════╝

我已经将我的关系模型规范化为 5NF,并且发现没有理由将 TYPELV 从关系中分离出来(这些不会导致更新异常)。但是如果 SPACESHIP_FLAT 关系中有大量元组,它将消耗大量资源(正如我所想的那样)——因此将它们分开会更有效一些。但是我在数据库设计理论中没有找到。

属性 TYPE 完全取决于属性 NAMENAME 表示类 TYPE 的实例 - 一个或多个实例属于一个类。 Soyuz TMA-14Soyuz 飞船系列的一个实例。所以它可以有一个且只有一个 TYPE 值。两组值 NAMETYPE 之间的关系是多对一的(没有多值依赖)。
属性 LV 以相同的方式依赖于属性 NAME
但如果我最终决定澄清 Soyuz TYPE 并将所有 Soyuz TMA-XX 航天器设置为 Soyuz TMA TYPESoyuz TM-XXSoyuz TM 等等,然后我需要更新每个 Soyuz* 记录号不管我是使用具有平面关系的第一个变体还是具有三种不同关系的变体。第二个将简化 Soyuz 的编辑值(因此它在数据完整性方面看起来更好)。
至于代理键 - 我使用它们是因为我需要它们以交叉引用关系表示(多对多,甚至 SPACESHIP_FLATSPACESHIP - 没有我的数据模型中的顶级关系)。

最佳答案

当然,您应该将这些类型分成不同的实体。这不仅会给太空经济带来好处,更重要的是会给你带来约束。因为现在我可以在那些列中输入任何值,例如 BlablaMichael Jordan。但是当您创建单独的实体并添加一些约束时,您将只能在这些列中输入批准的值。

可以说我将从业务层管理这些东西,但在一本好书中说:

If your column accepts NULLs, and you have implemented some strong logic which prevents entering NULLs from BL, anyway NULL will always find its way to your column.

您现在可以轻松地为您的列类型说同样的话。

关于database - 将具有频繁重复字符串值的关系属性分开是否合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30502530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com