ບໍ່ວ່າຈະເປັນທ່ານກໍາລັງເຮັດວຽກກັບຖານຂໍ້ມູນທີ່ເກັບບັນທຶກຫລືບັນທຶກຫລາຍຮ້ອຍບັນຊີ, ການອອກແບບຖານຂໍ້ມູນທີ່ເຫມາະສົມກໍ່ມີຄວາມສໍາຄັນ. ມັນຈະບໍ່ພຽງແຕ່ເຮັດໃຫ້ຂໍ້ມູນໄດ້ງ່າຍຂຶ້ນ, ມັນຍັງງ່າຍຕໍ່ການຂະຫຍາຍຖານຂໍ້ມູນໃນອະນາຄົດ. ແຕ່ຫນ້າເສຍດາຍ, ມັນງ່າຍທີ່ຈະຕົກເຂົ້າໄປໃນໃສ່ກັບດັກບໍ່ພໍເທົ່າໃດທີ່ສາມາດເຮັດໃຫ້ສິ່ງຕ່າງໆມີຄວາມຫຍຸ້ງຍາກໃນອະນາຄົດ.
ມີຫນັງສືທັງຫມົດທີ່ຂຽນກ່ຽວກັບວິທີການປົກກະຕິຖານຂໍ້ມູນ, ແຕ່ຖ້າທ່ານພຽງແຕ່ຫຼີກເວັ້ນການຜິດພາດທົ່ວໄປເຫຼົ່ານີ້, ທ່ານຈະຢູ່ໃນເສັ້ນທາງທີ່ຖືກຕ້ອງເພື່ອການອອກແບບຖານຂໍ້ມູນທີ່ດີ.
ຂໍ້ຜິດພາດຖານຂໍ້ມູນ # 1: ເຮັດຊ້ໍາອີກດ້ານຫນຶ່ງໃນຕາຕະລາງ
ກົດລະບຽບພື້ນຖານຂອງຫົວຂໍ້ສໍາລັບການອອກແບບຖານຂໍ້ມູນທີ່ດີແມ່ນການຮັບຮູ້ການເຮັດຊ້ໍາຂໍ້ມູນແລະການໃສ່ຄໍລໍາທີ່ repeating ເຫລົ່ານັ້ນໃນຕາຕະລາງຂອງຕົນເອງ. ການເຮັດຊ້ໍາໃນທົ່ງນາແມ່ນເປັນປະກະຕິສໍາລັບຜູ້ທີ່ມາຈາກໂລກຂອງຕາລາງ, ແຕ່ໃນຂະນະທີ່ຕາລາງຕາຕະລາງມີແນວໂນ້ມທີ່ຈະແບນອອກໂດຍການອອກແບບ, ຖານຂໍ້ມູນຄວນມີຄວາມກ່ຽວຂ້ອງ. ມັນຄ້າຍຄືການໄປຈາກ 2D ກັບ 3D.
ໂຊກດີ, ເຂດທົ່ງພຽງແມ່ນມັກຈະງ່າຍທີ່ຈະເຫັນ. ພຽງແຕ່ເບິ່ງຕາຕະລາງນີ້:
OrderID | Product1 | Product2 | Product3 |
1 | Teddy Bears | ແກ່ນຫມາກຖົ່ວ | |
2 | ແກ່ນຫມາກຖົ່ວ |
ຈະເກີດຫຍັງຂຶ້ນເມື່ອຄໍາສັ່ງປະກອບມີສີ່ຜະລິດຕະພັນ? ພວກເຮົາຈະຕ້ອງເພີ່ມພາກສະຫນາມອີກເພື່ອສະຫນັບສະຫນູນຫຼາຍກວ່າສາມຜະລິດຕະພັນ. ແລະຖ້າຫາກວ່າພວກເຮົາໄດ້ສ້າງຄໍາຮ້ອງສະຫມັກຂອງລູກຄ້າທົ່ວຕາຕະລາງເພື່ອຊ່ວຍໃຫ້ພວກເຮົາເຂົ້າຂໍ້ມູນ, ພວກເຮົາອາດຕ້ອງປັບປຸງມັນກັບເຂດຜະລິດຕະພັນໃຫມ່. ແລະເຮັດແນວໃດພວກເຮົາພົບເຫັນຄໍາສັ່ງທັງຫມົດທີ່ມີ Jellybeans ໃນຄໍາສັ່ງ? ພວກເຮົາຈະຖືກບັງຄັບໃຫ້ຄົ້ນຫາທຸກເຂດຜະລິດຕະພັນໃນຕາຕະລາງທີ່ມີຄໍາສັ່ງ SQL ທີ່ອາດຈະຄື: SELECT * FROM ຜະລິດຕະພັນ WHERE Product1 = 'Jelly Beans' OR product2 = 'Jelly Beans' OR product3 = 'Jelly Beans'.
ແທນທີ່ຈະມີຕາຕະລາງດຽວທີ່ stuffs ທັງຫມົດຂໍ້ມູນຮ່ວມກັນ, ພວກເຮົາຄວນມີສາມຕາຕະລາງທີ່ແຕ່ລະຄົນຖືເປັນຂໍ້ຄວາມທີ່ແຕກຕ່າງກັນ. ໃນຕົວຢ່າງນີ້, ພວກເຮົາຕ້ອງການຕາຕະລາງຄໍາສັ່ງທີ່ມີຂໍ້ມູນກ່ຽວກັບຄໍາສັ່ງຂອງຕົວມັນເອງ, ຕາຕະລາງຜະລິດຕະພັນທີ່ມີທັງຜະລິດຕະພັນຂອງພວກເຮົາແລະ TabletOrders ທີ່ເຊື່ອມໂຍງກັບຜະລິດຕະພັນກັບຄໍາສັ່ງ.
OrderID | CustomerID | ວັນທີ່ສັ່ງຊື້ | ລວມ |
1 | 7 | 1/24/17 | 1999 |
2 | 9 | 1/25/17 | 2499 |
ProductID | ຜະລິດຕະພັນ | Count |
1 | Teddy Bears | 1 |
2 | ແກ່ນຫມາກຖົ່ວ | 100 |
ProductOrderID | ProductID | OrderID |
101 | 1 | 1 |
102 | 2 | 1 |
ສັງເກດເບິ່ງວ່າແຕ່ລະຕາຕະລາງມີເຂດຂໍ້ມູນເອກະລັກຂອງຕົນເອງ. ນີ້ແມ່ນກຸນແຈສໍາຄັນ. ພວກເຮົາເຊື່ອມຕໍ່ຕາຕະລາງດ້ວຍການນໍາໃຊ້ຄ່າທີ່ສໍາຄັນເປັນກຸນແຈຕ່າງປະເທດໃນຕາຕະລາງອື່ນ. ອ່ານເພີ່ມເຕີມກ່ຽວກັບຄີຫລັກແລະແປ້ນຕ່າງປະເທດ.
ຂໍ້ຜິດພາດຖານຂໍ້ມູນ # 2: ຝັງຕາຕະລາງໃນຕາຕະລາງ
ນີ້ແມ່ນຂໍ້ຜິດພາດທີ່ຜິດພາດອີກ, ແຕ່ມັນກໍ່ບໍ່ໄດ້ສະແດງໃຫ້ເຫັນເຖິງຂົງເຂດທີ່ຊ້ໍາອີກ. ໃນເວລາທີ່ການອອກແບບຖານຂໍ້ມູນ, ທ່ານຕ້ອງການໃຫ້ແນ່ໃຈວ່າຂໍ້ມູນທັງຫມົດໃນຕາຕະລາງກ່ຽວຂ້ອງກັບຕົວມັນເອງ. ມັນຄ້າຍຄືເກມຂອງເດັກທີ່ກ່ຽວກັບສິ່ງທີ່ແຕກຕ່າງກັນ. ຖ້າທ່ານມີຫມາກກ້ວຍ, ສະຕໍເບີລີ່, ເປັກແລະໂທລະທັດ, ໂທລະທັດອາດຈະຢູ່ບ່ອນອື່ນ.
ຕາມເສັ້ນດຽວກັນ, ຖ້າທ່ານມີຕາຕະລາງຂາຍຂອງຜູ້ຂາຍ, ທຸກຂໍ້ມູນໃນຕາຕະລາງນັ້ນຄວນກ່ຽວຂ້ອງກັບຜູ້ຂາຍນັ້ນ. ຂໍ້ມູນພິເສດໃດໆທີ່ບໍ່ແມ່ນເອກະລັກຂອງຄົນຂາຍນັ້ນອາດຈະຢູ່ໃນຖານຂໍ້ມູນຂອງທ່ານອີກ.
SalesID | ຫນ້າທໍາອິດ | ສຸດທ້າຍ | ທີ່ຢູ່ | ເບີໂທລະສັບ | Office | OfficeNumber |
1 | Sam | Elliot | 118 Main St, Austin, TX | (215) 555-5858 | Austin Downtown | (212) 421-2412 |
2 | Alice | Smith | 504 2nd Street, New York, NY | (211) 122-1821 | ນິວຍອກ (ຕະວັນອອກ) | (211) 855-4541 |
3 | Joe | Parish | 428 Aker St, Austin, TX | (215) 545-5545 | Austin Downtown | (212) 421-2412 |
ໃນຂະນະທີ່ຕາຕະລາງນີ້ອາດຈະຄ້າຍຄືມັນທັງຫມົດທີ່ກ່ຽວຂ້ອງກັບຜູ້ຂາຍສ່ວນບຸກຄົນ, ມັນກໍ່ມີຕາຕະລາງທີ່ຕິດຢູ່ພາຍໃນຕາຕະລາງ. ສັງເກດເບິ່ງວ່າ Office ແລະ OfficeNumber ເຮັດຊ້ໍາກັບ "Austin Downtown". ຈະເປັນແນວໃດຖ້າວ່າເບີໂທລະສັບຂອງຫ້ອງການມີການປ່ຽນແປງ? ທ່ານຈໍາເປັນຕ້ອງໄດ້ປັບປຸງຊຸດຂໍ້ມູນທັງຫມົດສໍາລັບການປ່ຽນແປງຂໍ້ມູນຫນຶ່ງ, ເຊິ່ງບໍ່ແມ່ນສິ່ງທີ່ດີ. ທົ່ງນາເຫຼົ່ານີ້ຄວນຖືກຍ້າຍໄປຫາຕາຕະລາງຂອງຕົນເອງ.
SalesID | ຫນ້າທໍາອິດ | ສຸດທ້າຍ | ທີ່ຢູ່ | ເບີໂທລະສັບ | OfficeID |
1 | Sam | Elliot | 118 Main St, Austin, TX | (215) 555-5858 | 1 |
2 | Alice | Smith | 504 2nd Street, New York, NY | (211) 122-1821 | 2 |
3 | Joe | Parish | 428 Aker St, Austin, TX | (215) 545-5545 | 1 |
OfficeID | Office | OfficeNumber |
1 | Austin Downtown | (212) 421-2412 |
2 | ນິວຍອກ (ຕະວັນອອກ) | (211) 855-4541 |
ແບບການອອກແບບນີ້ກໍ່ໃຫ້ທ່ານສາມາດເພີ່ມຂໍ້ມູນເພີ່ມເຕີມໃນຕາຕະລາງຫ້ອງການໂດຍບໍ່ມີການສ້າງຄວາມຝັນຮ້າຍໃນຕາຕະລາງຜູ້ຂາຍ. ຈິນຕະນາການເຮັດວຽກຫຼາຍປານໃດທີ່ຈະພຽງແຕ່ຕິດຕາມເສັ້ນທາງຖະຫນົນ, ເມືອງ, ລັດແລະລະຫັດໄປສະນີຖ້າທຸກຂໍ້ມູນນັ້ນຢູ່ໃນຕາຕະລາງຜູ້ຂາຍ!
ຂໍ້ຜິດພາດຖານຂໍ້ມູນ # 3: ການເອົາຂໍ້ມູນສອງຫຼືຫຼາຍຂໍ້ມູນເຂົ້າໄປໃນພາກສະຫນາມດຽວ
ການຕິດຕັ້ງຂໍ້ມູນສໍານັກງານເຂົ້າໃນຕາຕະລາງຜູ້ຂາຍແມ່ນບໍ່ແມ່ນບັນຫາດຽວກັບຖານຂໍ້ມູນນັ້ນ. ພາກສະຫນາມທີ່ມີຂໍ້ມູນສາມຂໍ້ຄື: ຖະຫນົນຖະຫນົນ, ເມືອງແລະລັດ. ແຕ່ລະເຂດໃນຖານຂໍ້ມູນຄວນມີພຽງແຕ່ຫນຶ່ງຂໍ້ມູນດຽວ. ເມື່ອທ່ານມີຂໍ້ມູນຫຼາຍຢ່າງໃນແຕ່ລະພາກສະຫນາມ, ມັນກໍ່ສາມາດຊອກຫາຖານຂໍ້ມູນສໍາລັບຂໍ້ມູນ.
ຕົວຢ່າງ, ຖ້າພວກເຮົາຕ້ອງການສອບຖາມກ່ຽວກັບຜູ້ຂາຍທັງຫມົດຈາກ Austin ແນວໃດ? ພວກເຮົາຈະຕ້ອງຊອກຫາຢູ່ພາຍໃນສະຫນາມທີ່ບໍ່ມີປະສິດທິພາບແຕ່ສາມາດສົ່ງຂໍ້ມູນທີ່ບໍ່ຖືກຕ້ອງ. ຫຼັງຈາກທີ່ທັງຫມົດ, ສິ່ງທີ່ເກີດຂື້ນຖ້າມີຄົນຢູ່ໃນຖະຫນົນ Austin ໃນ Portland, Oregon?
ນີ້ແມ່ນສິ່ງທີ່ຕາຕະລາງຄວນຄື:
SalesID | ຫນ້າທໍາອິດ | ສຸດທ້າຍ | ທີ່ຢູ່ 1 | Address2 | ນະຄອນ | ລັດ | Zip | ໂທລະສັບ |
1 | Sam | Elliot | 118 Main St | Austin | TX | 78720 | 2155555858 | |
2 | Alice | Smith | 504 2nd St | ເມືອງນີວຢອກ | NY | 10022 | 2111221821 | |
3 | Joe | Parish | 428 Aker St | Apt 304 | Austin | TX | 78716 | 2155455545 |
ມີສອງສິ່ງທີ່ຄວນບັນທຶກຢູ່ທີ່ນີ້. ຫນ້າທໍາອິດ, "Address1" ແລະ "Address2" ເບິ່ງຄືວ່າຈະຕົກຢູ່ພາຍໃຕ້ຂໍ້ຜິດພະລາດໃນພາກສະຫນາມດຽວກັນ.
ຢ່າງໃດກໍຕາມ, ໃນກໍລະນີນີ້ພວກເຂົາກໍາລັງອ້າງອີງເຖິງຕ່ອນແຍກຂອງຂໍ້ມູນທີ່ກ່ຽວຂ້ອງໂດຍກົງກັບບຸກຄົນທີ່ຂາຍແທນທີ່ຈະເປັນກຸ່ມທີ່ຕ້ອງການຂໍ້ມູນທີ່ຄວນຈະຢູ່ໃນຕາຕະລາງຂອງຕົນເອງ.
ນອກຈາກນີ້, ເປັນຄວາມຜິດພາດເງິນທີ່ຈະຫຼີກເວັ້ນການ, ສັງເກດເຫັນວິທີການຈັດຮູບແບບສໍາລັບຈໍານວນໂທລະສັບໄດ້ຖືກຖອນອອກຈາກຕາຕະລາງ. ທ່ານຄວນຫຼີກເວັ້ນການເກັບຮັກສາຮູບແບບຂອງທົ່ງນາໃນເວລາທີ່ເປັນໄປໄດ້. ໃນກໍລະນີທີ່ມີເບີໂທລະສັບ, ມີຄົນຫຼາຍໆຄົນທີ່ຂຽນຫມາຍເລກໂທລະສັບ: 215-555-5858 ຫຼື (215) 555-5858. ນີ້ຈະເຮັດໃຫ້ການຊອກຫາບຸກຄົນທີ່ຂາຍໂດຍຫມາຍເລກໂທລະສັບຂອງເຂົາເຈົ້າຫຼືເຮັດການຄົ້ນຫາຂອງຜູ້ຂາຍໃນລະຫັດພື້ນທີ່ດຽວກັນມີຄວາມຫຍຸ້ງຍາກຫຼາຍ.
ຂໍ້ຜິດພາດຖານຂໍ້ມູນ # 4: ບໍ່ນໍາໃຊ້ຄີຫລັກທີ່ຖືກຕ້ອງ
ໃນກໍລະນີຫຼາຍທີ່ສຸດ, ທ່ານຈະຕ້ອງໃຊ້ຕົວເລກ incrementing ອັດຕະໂນມັດຫຼືບາງເລກທີ່ຜະລິດອື່ນຫຼືອັກສອນຕົວເລກສໍາລັບຫຼັກຫຼັກຂອງທ່ານ. ທ່ານຄວນຫຼີກເວັ້ນການນໍາໃຊ້ຂໍ້ມູນທີ່ແທ້ຈິງໃດໆສໍາລັບຄີຫລັກເຖິງແມ່ນວ່າມັນຄ້າຍຄືມັນຈະເຮັດໃຫ້ຕົວລະບຸທີ່ດີ.
ຕົວຢ່າງ, ພວກເຮົາມີລະຫັດປະກັນສັງຄົມຂອງພວກເຮົາແຕ່ລະຄົນ, ດັ່ງນັ້ນການນໍາໃຊ້ລະຫັດປະກັນສັງຄົມສໍາລັບຖານຂໍ້ມູນຂອງພະນັກງານອາດຈະເປັນຄວາມຄິດທີ່ດີ. ແຕ່ໃນຂະນະທີ່ຫາຍາກ, ມັນກໍ່ເປັນໄປໄດ້ສໍາລັບແມ້ກະທັ້ງຈໍານວນຄວາມປອດໄພທາງສັງຄົມຈະປ່ຽນແປງແລະພວກເຮົາບໍ່ເຄີຍຕ້ອງການທີ່ຈະປ່ຽນແປງຫລັກຂອງພວກເຮົາ.
ແລະນັ້ນແມ່ນບັນຫາທີ່ນໍາໃຊ້ຂໍ້ມູນຕົວຈິງເປັນມູນຄ່າທີ່ສໍາຄັນ. ມັນສາມາດປ່ຽນແປງ.
ຂໍ້ຜິດພາດຖານຂໍ້ມູນ # 5: ບໍ່ໄດ້ໃຊ້ສົນທິສັນຍາຊື່
ນີ້ອາດຈະບໍ່ເປັນສິ່ງທີ່ໃຫຍ່ຫຼວງເມື່ອທ່ານໄດ້ເລີ່ມຕົ້ນການອອກແບບຖານຂໍ້ມູນຂອງທ່ານແຕ່ເມື່ອທ່ານເຂົ້າຫາຈຸດຂອງການຂຽນຂໍ້ມູນກັບຖານຂໍ້ມູນເພື່ອເອົາຂໍ້ມູນ, ການນໍາສະເຫນີຊື່ຈະຊ່ວຍໃນເວລາທີ່ທ່ານຈົດຈໍາຊື່ຂອງພາກສະຫນາມ.
ພຽງແຕ່ຈິນຕະນາການວ່າວິທີການທີ່ມີຄວາມຫຍຸ້ງຍາກຫຼາຍກວ່ານັ້ນຈະເປັນແນວໃດຖ້າຊື່ຖືກເກັບໄວ້ເປັນ FirstName, LastName ໃນຕາຕະລາງແລະ first_name, last_name ໃນຕາຕະລາງອື່ນ.
ສອງສົນທິສັນຍາຊື່ສຽງຫຼາຍທີ່ສຸດແມ່ນການກໍານົດຕົວອັກສອນທໍາອິດຂອງທຸກໆຄໍາໃນພາກສະຫນາມຫຼືແຍກຄໍາທີ່ໃຊ້ຫຍໍ້ລົງ. ນອກນັ້ນທ່ານຍັງສາມາດເຫັນນັກພັດທະນາຈໍານວນຫນຶ່ງທີ່ກໍາລັງຈົດທະບຽນຕົວອັກສອນທໍາອິດຂອງທຸກໆຄໍາໄດ້ຍົກເວັ້ນຄໍາທໍາອິດ: firstName, lastName.
ນອກນັ້ນທ່ານຍັງຕ້ອງການຕັດສິນໃຈກ່ຽວກັບການນໍາໃຊ້ຊື່ຕາຕະລາງຫຼືຊື່ປ້າຍຫຼາຍໆຕົວ. ມັນເປັນຕາຕະລາງຄໍາສັ່ງຫຼືຕາຕະລາງການສັ່ງຊື້? ມັນເປັນຕາຕະລາງລູກຄ້າຫຼືຕາຕະລາງລູກຄ້າ? ອີກເທື່ອຫນຶ່ງ, ທ່ານບໍ່ຕ້ອງການທີ່ຈະຕິດຢູ່ກັບຕາຕະລາງຄໍາສັ່ງແລະຕາຕະລາງລູກຄ້າ.
ສົນທິສັນຍາຊື່ວ່າທ່ານເລືອກບໍ່ແມ່ນສິ່ງທີ່ສໍາຄັນຄືຂະບວນການຂອງການເລືອກແລະການຕິດຕາມສົນທິສັນຍາຊື່.
ຂໍ້ຜິດພາດຖານຂໍ້ມູນ # 6: ການດັດສ້າງບໍ່ຖືກຕ້ອງ
ການດັດສະນີແມ່ນສິ່ງຫນຶ່ງທີ່ຍາກທີ່ສຸດທີ່ຈະໄດ້ຮັບ, ໂດຍສະເພາະແມ່ນສໍາລັບຄົນໃຫມ່ໃນການອອກແບບຖານຂໍ້ມູນ. ທຸກໆຫຼັກແລະຫຼັກຕ່າງປະເທດຄວນຖືກດັດຊະນີ. ເຫຼົ່ານີ້ແມ່ນສິ່ງທີ່ເຊື່ອມໂຍງຕາຕະລາງຮ່ວມກັນ, ດັ່ງນັ້ນໂດຍບໍ່ມີດັດຊະນີ, ທ່ານຈະເຫັນການປະຕິບັດທີ່ບໍ່ດີຈາກຖານຂໍ້ມູນຂອງທ່ານ.
ແຕ່ສິ່ງທີ່ຖືກລືມເລື້ອຍໆແມ່ນຂົງເຂດອື່ນໆ. ເຫຼົ່ານີ້ແມ່ນຂົງເຂດ "WHERE". ຖ້າທ່ານມັກຈະຄົ້ນຫາການຄົ້ນຫາຂອງທ່ານໂດຍໃຊ້ເຂດຂໍ້ມູນໃນຂໍ້ກໍານົດ WHERE, ທ່ານຕ້ອງການຄິດກ່ຽວກັບການວາງດັດສະນີໃນຂົງເຂດນັ້ນ. ຢ່າງໃດກໍຕາມ, ທ່ານບໍ່ຕ້ອງການ indexing ຫຼາຍເກີນໄປຕາຕະລາງ, ເຊິ່ງຍັງສາມາດທໍາຮ້າຍຜົນປະໂຫຍດ.
ວິທີການຕັດສິນໃຈ? ນີ້ແມ່ນສ່ວນຫນຶ່ງຂອງສິນລະປະຂອງການອອກແບບຖານຂໍ້ມູນ. ບໍ່ມີຂໍ້ຈໍາກັດທີ່ຫນັກແຫນ້ນກ່ຽວກັບຈໍານວນດັດຊະນີທີ່ທ່ານຄວນໃສ່ໃນຕາຕະລາງ. ສ່ວນໃຫຍ່, ທ່ານຕ້ອງການ index ດັດສະນີທີ່ຖືກນໍາໃຊ້ເລື້ອຍໆໃນຄໍາສັບ WHERE. ອ່ານເພີ່ມເຕີມກ່ຽວກັບດັດນີຖານຂໍ້ມູນຂອງທ່ານຢ່າງຖືກຕ້ອງ.