ການວາງຖານຂໍ້ມູນໃນຮູບແບບປົກກະຕິທີສາມ (3NF)

ຮູບແບບປົກກະຕິທີສາມ (3NF) ແມ່ນຫຼັກຖານຖານຂໍ້ມູນທີ່ສະຫນັບສະຫນູນຄວາມສົມບູນຂອງຂໍ້ມູນໂດຍການສ້າງ ຖານຂໍ້ມູນປົກກະຕິຂອງຖານຂໍ້ມູນທີ່ ສະຫນອງໂດຍແບບຟອມທໍາອິດທໍາອິດ (1NF) ແລະແບບຟອມປົກກະຕິທີ 2 (2NF).

ຂໍ້ກໍານົດແບບຟອມມາດຕະຖານທີ່ສາມແບບປົກກະຕິ

ມີສອງຄວາມຕ້ອງການພື້ນຖານສໍາລັບຖານຂໍ້ມູນຈະຢູ່ໃນຮູບແບບປົກກະຕິທີສາມ:

ກ່ຽວກັບຄວາມສໍາຄັນທີ່ສໍາຄັນ

ໃຫ້ຄົ້ນຫາຕື່ມອີກວ່າພວກເຮົາຫມາຍຄວາມວ່າແນວໃດວ່າຄໍລໍາທັງຫມົດຕ້ອງຂຶ້ນຢູ່ກັບຫຼັກຫຼັກ.

ຖ້າຄ່າຂອງຄໍລໍາສາມາດມາຈາກທັງຄີຫລັກແລະຄໍລໍາອື່ນໃນຕາຕະລາງ, ມັນຈະລະເມີດ 3NF. ພິຈາລະນາຕາຕະລາງພະນັກງານທີ່ມີຄໍລໍາເຫຼົ່ານີ້:

ເຮັດທັງຊື່ LastName ແລະ FirstName ແມ່ນບໍ່ເທົ່າກັບຄ່າຂອງ EmployeeID? ດີ, LastName ສາມາດຂຶ້ນຢູ່ກັບ FirstName? ບໍ່, ເພາະວ່າບໍ່ມີຫຍັງເກີດຂຶ້ນໃນ LastName ຈະແນະນໍາໃຫ້ມູນຄ່າຂອງ FirstName. FirstName ສາມາດຂຶ້ນຢູ່ກັບ LastName? ບໍ່ມີອີກເທື່ອຫນຶ່ງ, ເນື່ອງຈາກວ່າດຽວກັນນີ້ແມ່ນຄວາມຈິງ: ໃດກໍ່ຕາມ LastName ອາດຈະ, ມັນບໍ່ສາມາດສະຫນອງຂໍ້ hint ເປັນມູນຄ່າຂອງ FirstName. ດັ່ງນັ້ນ, ຕາຕະລາງນີ້ແມ່ນ 3NF ສອດຄ່ອງ.

ແຕ່ພິຈາລະນາຕາຕະລາງຍານພາຫະນະນີ້:

ຜູ້ຜະລິດແລະຕົວແບບສາມາດມາຈາກ VehicleID - ແຕ່ຕົວແບບນີ້ຍັງສາມາດມາຈາກຜູ້ຜະລິດເພາະວ່າຮູບແບບຍານພາຫະນະແມ່ນເຮັດໄດ້ໂດຍຜູ້ຜະລິດໂດຍສະເພາະເທົ່ານັ້ນ. ການອອກແບບຕາຕະລາງນີ້ແມ່ນບໍ່ສອດຄ່ອງກັບ 3NF, ແລະດັ່ງນັ້ນຈຶ່ງສາມາດເຮັດໃຫ້ຂໍ້ຜິດພະລາດຂໍ້ມູນ. ຕົວຢ່າງ, ທ່ານອາດຈະປັບປຸງຜູ້ຜະລິດໂດຍບໍ່ມີການປັບປຸງຮູບແບບ, ການນໍາຂໍ້ມູນທີ່ບໍ່ຖືກຕ້ອງ.

ເພື່ອເຮັດໃຫ້ມັນສອດຄ່ອງ, ພວກເຮົາຈະຕ້ອງຍ້າຍຄໍລໍາຂຶ້ນກັບຕາຕະລາງອື່ນແລະອ້າງອີງໃສ່ມັນໂດຍໃຊ້ແປ້ນຕ່າງປະເທດ. ນີ້ຈະເປັນຜົນມາຈາກສອງຕາຕະລາງ:

ຕາຕະລາງຍານພາຫະນະ

ໃນຕາຕະລາງຂ້າງລຸ່ມ, ModelID ເປັນແປ້ນຕ່າງປະເທດໃນຕາຕະລາງ Models :

ຕາຕະລາງແບບ

ຕາຕະລາງໃຫມ່ນີ້ແມ່ນຮູບແບບສໍາລັບຜູ້ຜະລິດ. ຖ້າທ່ານຕ້ອງການປັບປຸງຂໍ້ມູນຂ່າວສານຍານພາຫະນະໃດໆໃຫ້ແກ່ເຄື່ອງຈັກ, ທ່ານຈະເຮັດໃນຕາຕະລາງນີ້ແທນທີ່ຈະຢູ່ໃນຕາຕະລາງຍານພາຫະນະ.

ຕົວເດັ່ນໃນຮູບ 3NF

ຕາຕະລາງອາດຈະມີພາກສະຫນາມມາ - ຫນຶ່ງທີ່ຖືກຄິດໄລ່ອີງໃສ່ຄໍລໍາອື່ນໆໃນຕາຕະລາງ. ຕົວຢ່າງ, ພິຈາລະນາຕາຕະລາງຂອງຄໍາສັ່ງຂອງ widget ນີ້:

ຈໍານວນທັງຫມົດເຮັດໃຫ້ການປະຕິບັດຕາມ 3NF ເພາະວ່າມັນສາມາດນໍາມາຜະລິດໂດຍການເພີ່ມລາຄາຂອງຫນ່ວຍໂດຍປະລິມານ, ແທນທີ່ຈະແມ່ນຂຶ້ນຢູ່ກັບຫຼັກຫຼັກ. ພວກເຮົາຕ້ອງເອົາມັນອອກຈາກຕາຕະລາງເພື່ອປະຕິບັດຕາມແບບຟອມປົກກະຕິທີສາມ.

ໃນຄວາມເປັນຈິງ, ເນື່ອງຈາກວ່າມັນໄດ້ມາ, ມັນດີກວ່າທີ່ຈະບໍ່ເກັບມັນຢູ່ໃນຖານຂໍ້ມູນຢູ່ທັງຫມົດ.

ພວກເຮົາພຽງແຕ່ສາມາດຄິດໄລ່ມັນໄດ້ "ໃນການບິນ" ເມື່ອປະຕິບັດການສອບຖາມຖານຂໍ້ມູນ. ສໍາລັບຕົວຢ່າງ, ພວກເຮົາອາດຈະນໍາໃຊ້ຂໍ້ມູນການຄົ້ນຫານີ້ມາກ່ອນເພື່ອຊອກຫາເລກລໍາດັບແລະຈໍານວນຄໍາສັ່ງ:

SELECT OrderNumber, Total FROM WidgetOrders

ພວກເຮົາຕອນນີ້ສາມາດນໍາໃຊ້ຄໍາຖາມຕໍ່ໄປນີ້:

SELECT OrderNumber, UnitPrice * Quantity AS Total FROM WidgetOrders

ເພື່ອບັນລຸຜົນດຽວກັນໂດຍບໍ່ມີການລະເມີດກົດລະບຽບປົກກະຕິ.