我刚刚开始使用数据库,但我无法使用member_address权限获取规范化corred。由于没有代表,我似乎无法发布图片所以我会尝试解释我的表格。
会员(表)
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:会员地址
ATT:Member_State
ATT:Member_City
我不太明白如何处理这个问题。我在想我需要两个单独的表来正确显示数据,但看起来我的PK和FK在这里并不完全正确。是否最好有一张满是各州和城市的桌子?或者有一个邮政编码查找城市?在这里很丢失...
答案 0 :(得分:6)
在现实世界中,人们可以共享同一个地址,一个人可以拥有多个地址。此外,人们可以移动(不确定这对您的模型是否重要),因此人与地址之间的关系应该具有date_from / date_through属性(同样,在您的应用程序的上下文中它可能并不重要,因此您可以跳过此部分) 。因此,我会选择像
这样的东西 <强>国家强>:
country_id(PK)
名字
<强>国家强>:
state_id(PK)
命名
country_id(FK)
<强>地址强>:
address_id(PK)
state_id(FK)
country_id(FK)
城市
- 其他属性,如address_line_1,unit_number,postal_code等...
**注意:为简单起见,我在这里存储了state_id和country_id,这在某种意义上会破坏规范化。但是,您可能希望允许人们不要进入州,并且并非所有国家都有州。
<强> 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 ......
答案 1 :(得分: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关系的那个。
答案 2 :(得分:0)
首先考虑实体和关系(概念设计),而不是直接建立物理模型(表格和索引);你在问题中描述了一种混合体。
然后,确定唯一标识每个实例的每个实体的属性。这是一个(候选的,自然的)主键。对于每个实体,确定是否有其他(候选,自然)主键。
然后使用相应的外键标识实体之间的每个关系。对于此处的主 - 详细信息关系,确定详细实体中映射到主实体中(候选,自然)主键的属性集,从而构成此关系的外键。
现在您已准备好设计概念设计的物理模型的表和索引。