1

EDIT1:试图通过重命名表格及其关系来解决问题。EDIT2:请不要查看我在三个数据库表中保存的数据类型。他们是在飞行中组成的。它们不是我的真实世界场景(不,我不能谈论我的真实世界数据......事实上,目前它是 1 个父母和 6 个孩子)。请忽略什么类型的数据,只看需要一些数据的事实。EDIT3:这两个 FK 是 0 或 1 对 1 的关系。不是 0 到很多。不是 1 对 1。我试图避免 0 或 1 对 1 关系与 1 对 1 关系,所以我不需要外部连接,而是有一个内部连接。

问题:我需要知道建议的数据库设计是好/坏/蹩脚/等等。

问题:今天我尝试制作索引视图,但失败了,因为我的表有外连接。叹。所以我想知道我是否可以将其修复为如下设计:

  • 三张桌子。
  • table_User 在 table_Address 上有一个 FK
  • table_User 在 table_Vehicle 上有一个 FK
  • ETC..

和表 B 和 C(现在有点像查找表)有..

  • Id INT IDENTITY PK
  • 说明 NVARCHAR(100) NULLABLE

注意可以为空的?这样,table_User 中的某些内容在 table_Address 中不存在......该字段为空(因为内部连接)。

之前,我做了一个 LEFT OUTER JOIN,所以如果 table_b 中没有数据,我会得到空值是每个字段的结果。

我将在这里抛出一些数据示例......

表_用户

  • ID:1,姓名:Fred,地址ID:1(NULL)
  • ID: 2, Name: Joe, AddressID: 2 (1 smith street.....)
  • ID: 3, Name: Jane, AddressID: 2 (1 smith street.....)

表地址

  • ID:1,描述 = NULL
  • ID:2,描述 = 1 smith street

等等

所以我终于可以把这一切都放到一个索引视图中。(我的现实生活场景大约有 8 张桌子)。

注意:DB 是 Microsoft Sql Server 2008,但这可能适用于任何 DB。

Q1:这个设计看起来还可以吗?

Q2:所以我在这里做的是对数据进行规范化,对吗?通过保持内部连接在一起。

Q3:最后,如果这是一个好的方法..我是否也可以通过一些唯一的约束或键或索引或什么来确保表中的数据是唯一的(例如街道地址)(我不确定的适当术语)。

谢谢大师!

4

4 回答 4

5

我发现您的问题令人困惑,但也许我可以提供一些帮助。

首先,表没有连接,查询有。您不会创建一个连接到另一个表的表。只有 2 个表可能相关,您可以使用联接查询这些表。

我建议您阅读有关 db normalization 的内容。维基百科有一篇很棒的文章:http ://en.wikipedia.org/wiki/Database_normalization

关于您目前的情况,我不确定您要做什么。如果该地址在不同的行中重复,则具有地址的 ID 似乎没问题。然而,需要几个“地址表”似乎很奇怪。设计时要记住的最重要的事情是: - 在每个表中都有一个正确的主键,这样您就可以正确地连接表。- 除非你有非常好的理由,否则不要重复数据。但我再次推荐上一篇文章。

希望有帮助!:)

于 2008-11-26T08:08:35.993 回答
1

一个非常令人困惑的问题,所以请查看数据库的规范化。第 3 范式(希望在英语中这样称呼)应该可以解决大多数问题。

快速提示:如果您有重复的数据,那么您需要一个单独的表,您可以通过外键在第一个表中引用该表。其他一切都只是查询。

于 2008-11-26T08:21:10.370 回答
0

我个人会对这种设计说“不”。原因:

  • (可能不适用)试图保持地址字段标准化意味着您需要处理此字段以确保避免意外重复。即您必须确保用户以正确的格式输入地址(否则 '1 mystreet' 也可以输入为 '1, mystreet' 或其他 - 需要检查这一点以避免重复,否则规范化无济于事)
  • 即使您找到规范化的理由(即为地址保留单独的表),“虚拟”地址的概念对我来说也很奇怪。为什么不使用可为空的 FK 关系,即在父用户表中存储一个 NULL 地址 ID,而不是在其中放置一个虚拟 ID。
于 2008-11-26T10:52:08.067 回答
0

因此,您基本上是在表 B 和 C 中添加虚假记录,以使行数与 A 中的行数相同?如果我是你,我不会这样做,因为如果你的数据集很大,那么你会在没有任何实际需要的情况下增加行数,而且你也面临着不一致的风险(你的布局很大程度上取决于你拥有插入这些虚假记录)。除此之外,你想用索引视图实现什么?性能增益?您不是在编写您正在使用的 DBMS,但是根据我在 MSSQL 方面的经验,这不会给您带来很多好处,因为只要您在表 A、B 和 C 中有适当的索引,服务器就可以使用即使没有索引视图,他们也可以构建良好的查询计划。

于 2008-11-26T08:43:49.043 回答