2014-11-06 43 views
4

作为家庭作业的一部分,我被要求基于案例研究创建表格,并且所有表格都必须位于3NF中。然而,我试过并试图理解3NF,但我只是没有得到它的诀窍,并希望得到一些帮助。如何将这些表规格化为3NF

的案例研究的要求是一个兽医诊所:

  1. 允许预订在宠物约会
  2. 记录宠物护理
  3. 记录其兽医进行治疗
  4. 记录项目由企业出售提供信息,允许企业生产供应商购买的库存清单

犯规需要:记录所有销售

我到目前为止下表:

人员:

| staff_ID | firstName | lastName | gender | address_ID | contactNumber | partTimeOrFullTime | salary | 

一位工作人员地址表:

| address_ID | staff_ID | number | street | city | county | postalCode | 

兽医表:

| staff_ID | appointment_ID | 

vet_nurse:

| staff_ID | appointment_ID | 

的委任表格:

| appointment_ID | customer_ID | staff_ID | patient_ID | date | time | 

initial_appointment表:

| appointment_ID | customer_ID | patient_ID | diagnosis | treatment | 

followUp_appointment:

| appointment_ID | customer_ID | patient_ID | diagnosis | treatment | 

病人:

| patient_ID | customer_ID | animal_type | gender | weight | height | previous_Appointments | previous_Treatment | 

产品:

| product_ID | name | product_Category | animal | price | quantity_Available | reOrder_Level | 

product_sold:

| sale_ID | product_ID | sale_Date | 

供应商:

| supplier_ID | product_ID | contactNumber | email | 

suppliers_address:

| supplierAddress_ID | supplier_ID | doorNumber | street | city | town | postalCode | 

库存:

| name | product_ID | quantity_Available | price | 

谢谢!

+1

只是一个提示:我会尝试和更好地格式化。这是一个很长的问题,很难过滤。 – AdamMc331 2014-11-06 14:37:09

+1

对于那些声称不理解正常化的人来说,这是非常好的努力!但是,将customer_id存储在客户表和患者表以外的任何地方都是多余的。日期和时间应该作为一个单独的实体存储。此外,没有单独的表格用于初始和后续。如果患者首次就诊时不是初次就诊,则将标志(0/1)存储在单独的栏中,指示“初次”就诊。 – Strawberry 2014-11-06 14:45:49

+0

在我为此制作的EERD中,我们被要求对泛化/专业化进行建模,并且我是如何做到这一点的:预约是初始预约还是后续预约。我不应该为他们做单独的表吗? – h21 2014-11-06 15:00:23

回答

1

我不会给你一个确切的答案有两个原因:1)我懒得过滤所有的文本。在那里,我说了。 2)你不会学到任何东西。

第三范式是关于没有传递函数的依赖关系。换句话说,如果A确定B,其中B不确定A,B确定C,那么你有一个传递依赖关系,所以B和C可以放入他们自己的表中。

您的套餐的示例可能是是包含城市,州和邮政编码的表格。在现实世界的情况下,邮政编码可以用来确定城市和州。也许你可以有一个以邮编为单位的单独表格作为关键字,城市和州是另外两个属性。这可以是一个传递依赖项,因为地址ID - >邮政编码和zip - >城市,如我所说的状态。

要记住的另一件重要事情是:如果有任何事实出现两次,您可以更正常化。例如,[城市A,州B,ZipCode C]可能会多次出现,因为我确定您有来自同一区域的多个人。

编辑 在寻找这一点,并对其进行编辑后,我发现了很多的事情发表评论,但因为这是一个任务,我会给你时间考虑一下,回来在几天或更长时间如果你还是好奇的话,可以再试一次。

EDIT 2

我给你的建议表的表,但会尝试将这些限制只推在正确的方向。

staff - 没有可传递的依赖关系跳出来,所有内容都由主键确定,这很好。

staff_address - 为什么你有一个staff_id列?这不是一个好主意。另外 - 我已经提到过,你对地址有传递依赖性。

vet and vet_nurse - 这些表具有完全相同的列,那么为什么有两个表?当然,有一种方法可以使用它。

appointment tables - 初始预约和跟进具有相同的列。再次,应该有一种方法可以让他们成为一个。我会给你一个预约表的直接建议:把日期和时间作为一列,aptDate,并给它DATETIME值类型。

patient - customer_ID值位于患者表中,为什么它应该放在其他患者表中?此外,之前的约会和以前的治疗将很难在数据库中跟踪。只要您开始输入数据,您就会看到。

product - 现在看来,这看起来不算太糟糕,但有些问题我会在后面讨论。

product_sold - sale_ID是唯一的吗?如果是这样,一次销售可以售出多少产品?这个表格绝对没有正常化。

supplier - 供应商可以提供多少种产品?这是您如何更改产品表的提示。

suppliers_address - 这里与邮政编码相同的问题。另外,为什么supplier_address指向供应商?

inventory - 您是不是已经在产品表中跟踪所有这些字段(价格除外)?

这些都是我看到的潜在问题,但我不能良心良心地为您提供解决方案。但是,如果这是您在规范化数据库中的第一次尝试,那么它一点也不差。

+0

我现在已经停留了一个星期左右,如果你能指出一些事情,那么我可以查看它并尝试改正它们 – h21 2014-11-06 15:46:45

+0

我一直在这里停留了一周左右,如果你能指出一些事情这需要改进我会appericiate它 – h21 2014-11-06 15:47:41

+0

@ h21什么时候你的任务到期? – AdamMc331 2014-11-06 17:19:01