数据库规范化问题



我刚开始学习数据库规范化,我有一个关于我的一个表的问题。我的数据库现在的结构很糟糕,其中一个原因是我有一个表是这样的。

<

客户表/strong>

ID |  Date_Entered   |  First_Name  |  Middle_Name |  Last_Name |    Maiden_Name 

Address__street_dmv | Address_city_dmv  | Address_state_dmv |   Address_zip_dmv

Address__street_source2  |  Address_state_source2  |  Address_city_source2  | etc

.

由于我的公司从多个来源获取地址数据,地址一直在不断增加。但是,当然,对于我们的一些客户,其中一些地址将为Null。所以我想我需要一个单独的地址表,像这样连接到Customers表。

.

<

地址/strong>

ID  |   Number  |    Street    |  State  |   Zip  |    Source (drop down menu)

但后来我想来源可能是冗余数据。那么,我需要这样一个单独的源表吗?

Source_ID  |    Source

然后像这样改变地址表?

ID  |   Number    |  Street    |  State  |   Zip    |  Source _ID (drop down)

这似乎不正确,因为现在Source_ID是多余的,请帮助。

如果您能告诉我是否应该在Customer表中包含Maiden和Middle name,那么就有好处了,因为这些也可能是Null(如果不是,新表将如何结构?)

对不起,我是个新手。

我会选择

客户

ID |  Date_Entered  |  First_Name  |  Middle_Name | Last_Name | Maiden_Name
<

地址/strong>

ID  |   Number  |    Street    |  State_ID  |   Zip

Customers_Address

ID | Customer_ID | Address_ID | Source_ID

这允许您从多个来源获得相同的地址。您可能还希望为街道创建单独的表,例如

Table_Street (ID | State_ID | Name)

,然后在Addresses表中,您将只有Street_ID而不是StreetState_ID。这也允许你在用户选择状态时显示街道的选择列表。

我认为在Customer表中使用Maiden和Middle name是可以的,即使它们很少使用。

你的问题一部分与规范化有关,另一部分与规范化无关。这并不意味着你的问题不重要。它只是意味着它很重要,原因与规范化无关。

从某种意义上说,你的地址本质上是一个重复的组。因此,将它们从客户中删除是有意义的。(这与标准化有关;重复组违反1NF.)

"Source"不是冗余数据,决定是否用ID号代替文本与规范化无关。

当您将表从较低的范式移动到较高的范式时,原始表的列将减少。将ID号替换为文本不会改变列数。

并且在每个用无意义的ID号替换文本的列中都需要一个连接来获得有意义的文本。按照相同的逻辑,您还可以用无意义的ID号替换街道、州和zip,但这需要四个连接才能获得有意义的数据。

我不是SQL专家,但这是我认为你想描述的。

一个客户是一个唯一的实体,有一个当前地址,可以有许多其他地址,如果这是正确的,你应该把额外的地址分开到他们自己的表中。

其次,您发现客户有x个地址的方式是您为每个客户获得不同公司的信息,如果是这种情况,我将为公司创建一个单独的表并按您的计划记录此信息,是的,您将有重复的source_id行,但这将是这种情况,因为它们提供有关许多不同客户的信息。

关于您的业务规则是否需要婚前名和中间名,如果需要,请在需要时存储它们。

我的SQL开发真的只是学生水平,但据我所知,这就是我将如何去做。

希望这对你有帮助,如果有人能提供更多的专家信息,就去吧。

您还可以尝试以下方法:

客户

CustomerID (PK) | Date_Entered | First_Name | Middle_Name | Last_NameMaiden_Name

<

地址/strong>

CustomerId (PK)(FK) | SourceID(PK) | Number | Street | State| Zip

假设客户和地址之间是一对多的关系。它还完全消除了Customer_Address表,转而使用两个表(Customer和Addresses),并为Addresses表定义一个复合主键,作为CustomerId和SourceID。在这个模型中,CustomerId和SourceId唯一地决定了Number、Street、State和Zip。它还通过确保每个客户只能拥有来自每个源的一个地址来加强数据完整性。让我知道这是否有帮助,或者如果我错了。我还在学习!

最新更新