4

我刚开始使用数据库,并且无法使用 member_address 实体进行规范化。由于没有代表,我似乎无法发布图片,因此我将尝试解释我的表格。

成员(表)
PK Member_ID
FK Member_Zip_Code
FK Membership_Type_code
ATT:First_Name
ATT:Last_name
ATT:Member_Phone
ATT:Member_Email

Member_Address (表)
PK Member_Zip_Code
FK Member_ID
ATT: Member Address
ATT: Member_State
ATT: Member_City

我不太明白如何处理这个问题。我在想我需要两个单独的表格来正确显示数据,但我的 PK 和 FK 似乎在这里并不完全正确。最好有一张满是州和城市的桌子吗?或者有一个邮政编码查找城市?在这里很迷失......

4

3 回答 3

6

在现实世界中,人们可以共享同一个地址,一个人可以拥有多个地址。此外,人们可以移动(不确定这对您的模型是否重要),因此人员和地址之间的关系应该具有 date_from/date_through 属性(同样,在您的应用程序的上下文中它可能并不重要,因此您可以跳过这部分) . 因此,我会选择类似的东西

国家
country_id(PK)
名称


state_id (PK)
名称
country_id (FK)

地址:
address_id (PK)
state_id (FK)
country_id (FK)
city
--其他属性,如address_line_1、unit_number、postal_code等...

**注意:为简单起见,我将 state_id 和 country_id 存储在这里,这在某种意义上破坏了 normalization 。但是,您可能希望允许人们不进入状态,并且并非所有国家/地区都有状态。

Member_Address :
member_address_id PK
member_id FK
address_id FK
date_from
date_thru
UNIQUE(member_id,address_id,date_from)

此外,您可能想要添加地址目的实体,并添加地址目的和成员地址之间的关系(例如,如果您需要区分家庭地址/工作地址/邮件地址)。

更进一步,您会看到邮政地址、电话和电子邮件都是通信手段,因此它们都可以视为通用实体的子类型,例如communication_mechanism...

于 2013-04-07T15:53:15.993 回答
2

如果你看一下http://en.wikipedia.org/wiki/Database_normalization,关于规范化有很多有趣的地方。您当然应该研究不同程度的标准化。

在您的情况下,您有一些成员,每个成员都有地址。设计中暗示成员只能有一个地址。同样,您的设计意味着该成员只有一部电话和一个电子邮件地址。您可以通过多种方式处理此问题,但对于初学者,您可能会考虑以下内容:

Member (Table)
MemberID (PK)
MemberAddressID (FK)
MembershipType (FK) -- To a dictionary-table with membership types.
FirstName (ATT)
LastName (ATT)
Phone (ATT) -- (*OR* it could be placed in a separate side-table with phonenumbers)
Email (ATT) -- (*OR* it could also be placed in a separate side-table)

Member_Address (Table)
Member_ID (FK)
Member Address (ATT)
Member_Zip_Code (ATT) -- (*OR* it could be FK to a separate table with Zip-codes, states and cities)
Member_City (ATT)
Member_State (ATT)

Member_city严格来说,您违反了Member_State第二范式,因为我假设城市和州在邮政编码中是隐含的。将电话和电子邮件作为属性保留在表格中时,您违反了规范化,因为您的设计无法处理多个电话号码(家庭/工作/手机)或电子邮件地址。

通常,这是通过添加一些额外的属性来解决的,解决了当前的问题,但保持了对规范化的违反。干净/正确的解决方案是将这些信息放在一个单独的边表中,就像地址已经存在一样,然后使用 FK/PK 关系链接到该边表。

于 2013-04-07T15:35:32.087 回答
0

首先考虑实体和关系(概念设计),而不是直接构建物理模型(表格和索引);你在你的问题中描述了一种混合体。

然后,识别唯一标识每个实例的每个实体的属性。那是一个(候选的,自然的)主键。对于每个实体,确定是否有额外的(候选的、自然的)主键。

然后使用相应的外键识别实体之间的每个关系。对于诸如此处的主从关系,确定详细实体中映射到主实体中(候选,自然)主键的属性集,从而构成该关系的外键。

现在您已准备好设计概念设计的物理模型的表和索引。

于 2013-04-07T15:27:05.393 回答