මගේ ටී-එස්එල්එල් ගුරුවරයා අපට පැවසුවේ අපගේ පීකේ තීරුව "අයිඩී" ලෙස නම් කිරීම වැඩිදුර පැහැදිලි කිරීමකින් තොරව නරක පුරුද්දක් ලෙස සලකන බවයි.
PK තීරුව "Id" ලෙස නම් කිරීම නරක පුරුද්දක් ලෙස සලකන්නේ ඇයි?
මගේ ටී-එස්එල්එල් ගුරුවරයා අපට පැවසුවේ අපගේ පීකේ තීරුව "අයිඩී" ලෙස නම් කිරීම වැඩිදුර පැහැදිලි කිරීමකින් තොරව නරක පුරුද්දක් ලෙස සලකන බවයි.
PK තීරුව "Id" ලෙස නම් කිරීම නරක පුරුද්දක් ලෙස සලකන්නේ ඇයි?
Answers:
ඒක ඇත්තටම නරක පුරුදු (සහ පවා එය, එහි නොමැති නම් නොවේ: මම ඇවිත් ඒක කියන්න යන්නේ ඒ නරක).
පහත දැක්වෙන විමසුමේදී මෙන් දෝෂ වසං කළ හැකි බවට ( චැඩ් පෙන්වා දුන් පරිදි) ඔබට තර්කය ඉදිරිපත් කළ හැකිය:
SELECT *
FROM cars car
JOIN manufacturer mfg
ON mfg.Id = car.ManufacturerId
JOIN models mod
ON mod.Id = car.ModelId
JOIN colors col
ON mfg.Id = car.ColorId
නමුත් ඔබේ වගු නාම සඳහා කුඩා අන්වර්ථ නාම භාවිතා නොකිරීමෙන් මෙය පහසුවෙන් අවම කර ගත හැකිය:
SELECT *
FROM cars
JOIN manufacturer
ON manufacturer.Id = cars.ManufacturerId
JOIN models
ON models.Id = cars.ModelId
JOIN colors
ON manufacturer.Id = cars.ColorId
තීරු නම භාවිතා කිරීමට වඩා සෑම විටම අකුරු 3 ක් භාවිතා කිරීම පුරුද්දක් ලෙස මට පෙනේ id
. (උදාහරණ ලෙස: වගුවේ නම cars
කෙටියෙන් කෙටියෙන් හඳුන්වන්නේ car
කවුද? එය සේවය කරන්නේ කුමන අවසානයටද?)
කාරණය වන්නේ: අනුකූල වන්න. ඔබේ සමාගම හැඳුනුම්පත භාවිතා කරන්නේ නම් සහ ඔබ සාමාන්යයෙන් ඉහත වැරැද්ද කරන්නේ නම්, සම්පූර්ණ වගු නම් භාවිතා කිරීමේ පුරුද්ද ඇති කරගන්න. ඔබේ සමාගම හැඳුනුම් තීරුව තහනම් කරන්නේ නම්, එය වේගයෙන් ගෙන ඔවුන් කැමති ඕනෑම නම් කිරීමේ සම්මුතියක් භාවිතා කරන්න.
මේ වගේ කාරණා ගැන කතා කරනවාට වඩා ඇත්ත වශයෙන්ම නරක පුරුදු (බහු කැදැලි සහසම්බන්ධිත උප විමසුම් වැනි) ඉගෙනීමට අවධානය යොමු කරන්න. ඔබේ තීරු "හැඳුනුම්පත" ලෙස නම් කිරීමේ ගැටළුව නරක පුරුද්දකට වඩා රසයට වඩා සමීප වේ.
සංස්කාරකවරුන්ට සටහනක්: මෙම විමසුමේ දෝෂය හිතාමතාම වන අතර එය කරුණු දැක්වීමට භාවිතා කරයි. සංස්කරණය කිරීමට පෙර කරුණාකර සම්පූර්ණ පිළිතුර කියවන්න.
cars
-> car
. දෙවියන්ට ස්තූතියි - ඔබ මගේ ඇඟිලි බේරා ගත්තා). ඒ ගැන ඕනෑවට වඩා කියවන්න එපා.
cars
සහ manufacturer
. එකක් බහු වචන, අනෙක එසේ නොවේ. මිනිසුන්ට ඩීබී එකෙන් තෝරා ගැනීමට අවශ්ය නම්, එය තෝරා ගත යුතු නරක පුරුද්ද එයයි.
ඔබ සතුව විදේශීය යතුරක් ඇති වගුවක් ඇති විට ඔබට එම විදේශීය යතුර "අයිඩී" ලෙස නම් කළ නොහැක. ඔබට මේස නාමය ඇත TableId
එවිට ඔබේ බැඳීම පෙනේ
SELECT * FROM cars c JOIN manufacturer m ON m.Id = c.ManufacturerId
ඔබේ තත්වය සෑම පැත්තකින්ම එකම ක්ෂේත්ර නාමයක් තිබිය යුතුය
SELECT * FROM cars c JOIN manufacturer m ON m.ManufacturerId = c.ManufacturerId
එබැවින් නිෂ්පාදකයා ලෙස හැඳුනුම්පත නම් කිරීම අතිරික්තයක් ලෙස පෙනුනද, එමඟින් වැරදි සම්බන්ධ වන විට ඔබේ සම්බන්ධ වීමේ කොන්දේසි වල දෝෂ ඇති බව අඩු වේ.
මෙය සරල බව පෙනේ, නමුත් ඔබ වගු කිහිපයකට සම්බන්ධ වූ විට, ඔබ වැරැද්දක් කිරීමට වැඩි ඉඩක් ඇත, පහත එක සොයා ගන්න ...
SELECT *
FROM cars car
JOIN manufacturer mfg
ON mfg.Id = car.ManufacturerId
JOIN models mod
ON mod.Id = car.ModelId
JOIN colors col
ON mfg.Id = car.ColorId
නිසි නම් කිරීම සමඟ, දෝෂය කැපී පෙනේ ...
SELECT *
FROM cars car
JOIN manufacturer mfg
ON mfg.ManufacturerId = car.ManufacturerId
JOIN models mod
ON mod.ModelId = car.ModelId
JOIN colors col
ON mfg.ManufacturerId = car.ColorId
අයිඩී "නරක" ලෙස නම් කිරීමට තවත් හේතුවක් නම්, ඔබ වගු කිහිපයකින් තොරතුරු විමසන විට ඔබට අයිඩී තීරු නම් කිරීමට අවශ්ය වන අතර එමඟින් ඔබට ඒවා වෙන්කර හඳුනාගත හැකිය.
SELECT manufacturer.Id as 'ManufacturerId'
,cars.Id as 'CarId'
--etc
FROM cars
JOIN manufacturer
ON manufacturer.Id = cars.Id
නිවැරදි නම් සහිතව මෙය ගැටළුවක් අඩුය
SELECT * FROM cars c JOIN manufacturer m ON manufacturer.Id = c.ManufacturerId
. මම id
වසර ගණනාවක් තිස්සේ භාවිතා කර ඇති අතර ඔබ විස්තර කළ දේ සැබෑ ගැටලුවක් ලෙස කිසි විටෙකත් සොයාගෙන නැත.
SELECT manufacturer.id FROM ...
. එහි ප්රති ing ලයක් ලෙස ඇති වන සෑම දුෂ්කරතාවයක්ම id
ඉතා පහසුවෙන් ජය ගත හැකි අතර එය හුදෙක් රසයේ කාරණයක් බවට පත් කරයි.
රූබීගේ ඇක්ටිව් රෙකෝඩ් පුස්තකාලය සහ ග්රෝවිගේ GORM පෙරනිමියෙන් අන්යාගමික යතුර සඳහා "හැඳුනුම්පත" භාවිතා කරයි. මම මේ පුරුද්දට කැමතියි. එක් එක් තීරුවේ නමෙහි වගුවේ නම අනුපිටපත් කිරීම අතිරික්තය, ලිවීමට වෙහෙසකාරී සහ කියවීමට වඩා වෙහෙසකාරී ය.
"නම" හෝ "හැඳුනුම්පත" වැනි පොදු හෝ යතුරු තීරු නම් වගු නාමය සමඟ උපසර්ග ගත යුතුය.
එය අපැහැදිලි බව ඉවත් කරයි, සෙවීමට පහසුය, එයින් අදහස් කරන්නේ "අයිඩී" අගයන් දෙකම අවශ්ය වූ විට තීරු අන්වර්ථයන් වඩා අඩු බවයි.
අඩුවෙන් භාවිතා කළ හෝ විගණන තීරුවක් හෝ යතුරක් (LastUpdatedDateTime කියන්න) වැදගත් නොවේ
name
හා id
? සෑම තීරුවක්ම එහි වගු නාමය සමඟ උපසර්ග කර නොගන්නේ මන්ද? උපසර්ගයක් නියම කිරීම සඳහා එම නම් දෙක තෝරා ගැනීම අත්තනෝමතික ලෙස පෙනේ. සංකල්පමය වශයෙන්, කෙසේ හෝ තීරුවක සන්දර්භය ලබා ගැනීම සඳහා ඔබට වගුව තිබිය යුතුය. විමසුම පැහැදිලි කිරීම සඳහා එම වගුවේ නම පමණක් භාවිතා නොකරන්නේ ඇයි: Person.Name, Animal.Name, Part.Name, ...
මෙම නූල මියගොස් ඇත, නමුත් IMO භාවිතා නොකිරීමId
නරක පුරුද්දක් බව එක් කිරීමට මම කැමැත්තෙමි . මෙම Id
තීරුව විශේෂ ය; එය මෙම ප්රාථමික යතුර. ඕනෑම වගුවකට විදේශීය යතුරු ගණනක් තිබිය හැකි නමුත් එයට තිබිය හැක්කේ ප්රාථමික යතුරක් පමණි. සියලුම ප්රාථමික යතුරු කැඳවා ඇති දත්ත ගබඩාවක Id
, ඔබ මේසය දෙස බැලූ විගසම ප්රාථමික යතුර කුමක්දැයි ඔබ හරියටම දනී.
මාව විශ්වාස කරන්න, දැන් මාස ගණනක් තිස්සේ මම සෑම දිනකම විශාල දත්ත සමුදායන් (විකුණුම් බලකාය) තුළ වැඩ කර ඇති අතර, ක්රමෝපායන් ගැන මට පැවසිය හැකි හොඳම දෙය නම් සෑම වගුවකටම ප්රාථමික යතුරක් Id
තිබීමයි. PK ලෙස හැඳින්වෙන නිසා විදේශීය යතුරකට ප්රාථමික යතුරක් සම්බන්ධ කිරීම ගැන මම කිසි විටෙකත් ව්යාකූල නොවන බව මට සහතික විය හැකිය Id
. මිනිසුන් සඳහන් නොකළ තවත් දෙයක් නම්, වගු වලට දිගු මෝඩ නම් තිබිය හැකි ය Table_ThatDoesGood_stuff__c
; ගෘහ නිර්මාණ ශිල්පියා උදේ වරුවේ හැන්ගෝවර් එකක් තිබූ නිසා එම නම නරක ය, නමුත් දැන් ඔබ මට කියන්නේ ප්රාථමික යතුර ඇමතීම නරක පුරුද්දක් බවයි Table_ThatDoesGood_stuff__cId
(SQL තීරු නම් සාමාන්යයෙන් සංවේදී නොවන බව මතක තබා ගැනීම).
ඇත්තම කිව්වොත්, පරිගණක ක්රමලේඛනය උගන්වන බොහෝ පුද්ගලයින්ගේ ගැටළු නම්, ඔවුන් වසර ගණනාවක සිට නිෂ්පාදන කේතයක් ලියා නොමැති අතර, වැඩ කරන මෘදුකාංග ඉංජිනේරුවෙකු ඇත්ත වශයෙන්ම කරන්නේ කුමක්ද යන්න පිළිබඳව ඔවුන්ට අවබෝධයක් නැත. ඔබ වැඩ කිරීමට පටන් ගන්නා තෙක් රැඳී සිට හොඳ අදහසක් හෝ නැතැයි ඔබ සිතන දේ ඔබේ මනසෙහි තබා ගන්න.
Data.stackexchange.com වෙතින්
BOOM, ප්රශ්නයට පිළිතුරු.
දැන් ගොස් ඔබේ ගුරුවරයාට කියන්න SO නරක දත්ත සමුදායක් සැලසුම් කරන බව.
PostTypeId -> PostTypes.Id
; AcceptedAnswerId -> Answers.Id
; OwnerUserId -> Users.Id
. එතරම් පහසු පුරුද්දක් 'නරක' ලෙස සැලකිය යුත්තේ ඇයි?
මම එය නරක පුරුද්දක් ලෙස සලකන්නේ නැහැ. සුපුරුදු පරිදි අනුකූලතාව රජ වේ.
මම හිතන්නේ ඒ සියල්ල සන්දර්භය ගැන ය. වගුවේ සන්දර්භය තුළ, "හැඳුනුම්පත" යන්නෙන් අදහස් කරන්නේ ඔබ අපේක්ෂා කරන දෙයමයි, වෙනත් ආකාරයකින් සමාන විය හැකි (හෝ පෙනෙන) අනෙක් අයට එරෙහිව එය අද්විතීය ලෙස හඳුනා ගැනීමට උපකාරී වන ලේබලයකි.
සම්බන්ධ වීමේ සන්දර්භය තුළ, ඔබට සහ ඔබේ කණ්ඩායමට කියවිය හැකි වන පරිදි සම්බන්ධතා ගොඩනැගීම ඔබේ වගකීමකි. දුර්වල වාක්ය ඛණ්ඩයක් හෝ නම් කිරීමක් සමඟ දේවල් දුෂ්කර කරවීමට හැකි සේම, අන්වර්ථ නාමයන් සහ අදහස් පවා effective ලදායී ලෙස භාවිතා කරමින් අර්ථවත් විමසුමක් තැනීම සමානව කළ හැකිය.
ජාවා පංතියක 'ෆූ' හි ගුණාංග 'ෆූ' මගින් උපසර්ගගත කර නැති ආකාරයටම, ඔබේ වගු හැඳුනුම්පත් වගු නාම සමඟ උපසර්ග කිරීමට බැඳී නොසිටින්න. හැඳුනුම්පත යනු කුමක්ද යන්න සාමාන්යයෙන් සන්දර්භය තුළ පැහැදිලි වේ.
මේසය මත ස්වාභාවික සම්බන්ධතාවයක් පැවැත්වීම දුෂ්කර (හා ව්යාකූල) කරයි, එබැවින් ඔව්, එය නරක නම් ඉතා නරක නොවේ.
ස්වාභාවික බැඳීම යනු SQL ලෝර් (එනම් සම්බන්ධතා වීජ ගණිතය) හි පුරාණ කෞතුක වස්තුවකි, ඔබ මේවායින් එකක් දැක ඇති: a සමහර විට දත්ත සමුදා පොතක. මා අදහස් කළේ නට්රූල් එක්වීම නව විකාර SQL අදහසක් නොවේ, එය ක්රියාත්මක කිරීම සඳහා ඩීබීඑම්එස් හි සදහටම ගත වන බවක් පෙනෙන්නට තිබුණද, එබැවින් එය ක්රියාත්මක කිරීම සඳහා ඔබට නව විකාර අදහසක් නොවේ, ඔබ නොසලකා හැරීම පවා අසාධාරණ විය හැකිය වර්තමානයේ එහි පැවැත්ම.
හොඳයි, ඔබ ඔබේ සියලුම ප්රාථමික යතුරු හැඳුනුම්පත නම් කළහොත්, ස්වාභාවික සම්බන්ධතාවයේ පහසුව සහ සරල බව ඔබට අහිමි වේ. select * from dudes natural join cars
ලිවීම සඳහා අවශ්ය වනු ඇත select * from dudes inner join cars where cars.dudeid = dudes.id
හෝ select * from dudes inner join cars where dudes.carid = cars.id
. ඔබට ස්වභාවික සම්බන්ධතාවයක් කිරීමට හැකි නම්, සම්බන්ධතාවය ඇත්ත වශයෙන්ම කුමක්ද යන්න නොසලකා හැරිය යුතුය, එය, නියමයි.
සෑම මේසයකම "හැඳුනුම්පත" ඇලවීම හොඳම අදහස නොවන තත්වයක් තිබේ :. USING
මූල පදය, එයට සහය නම්. අපි එය බොහෝ විට MySQL හි භාවිතා කරමු.
උදාහරණයක් ලෙස, ඔබ සතුව fooTable
තීරුව fooTableId
සහ barTable
විදේශීය යතුර තිබේ නම් fooTableId
, එවිට ඔබේ විමසීම් මෙසේ සාදා ගත හැකිය:
SELECT fooTableId, fooField1, barField2 FROM fooTable INNER JOIN barTable USING (fooTableId)
එය යතුරු ලියනය සුරකිනවා පමණක් නොව, විකල්පයට සාපේක්ෂව වඩා කියවිය හැකි ය:
SELECT fooTable.Id, fooField1, barField2 FROM fooTable INNER JOIN barTable ON (fooTable.Id = barTable.foTableId)
USING
මූල පදය postgres / mysql / sqlite දත්ත සමුදාය විසින් ආධාර කරනු ලබයි, භාවිතා කිරීම සඳහා හේතුවක් ලෙස අනෙක් පිළිතුරු ලැයිස්තුව සමහර අර්ථය ඇති අඩු ටයිප් id
, හා අවසානයේ මගේ ආත්මීය මතය වඩාත් හොඳින් කියවිය හැකි වේ.
ඔබේ ගුරුවරයාගෙන් පමණක් විමසන්නේ නැත්තේ ඇයි?
මේ ගැන සිතා බලන්න, ඔබගේ සියලු වගු PK තීරු නම් කළ ID
විට එය විදේශීය යතුරු ලෙස භාවිතා කිරීම බියකරු සිහිනයක් බවට පත් කරයි.
තීරු නම් අර්ථාන්විතව වැදගත් විය යුතුය. ID
යනු සාමාන්ය දෙයකි.
id
තනිවම කිසිවක් අදහස් නොකෙරේ, විශේෂයෙන් වෙනත් වගුවකට විදේශීය යතුරක සන්දර්භය තුළ. මෙයට කිසිදු සම්බන්ධයක් නැති classes
අතර හොඳ මූලික මූලික සම්බන්ධතා දත්ත සමුදා සැලසුමක් සමඟ කළ යුතු සියල්ල.
table.id
වෙත යොමු කිරීම සඳහා සම්පූර්ණයෙන්ම පිළිගත හැකි ක්රමයකි id
. ක්ෂේත්ර නාමය වගු නාමය සමඟ උපසර්ගය අතිරික්ත වේ.
පහත සඳහන් හේතු නිසා හැඳුනුම්පත නරක ය:
ඔබ වාර්තාකරණ විමසීම් රාශියක් කරන්නේ නම්, ඔබට ඒ දෙකම දැකීමට අවශ්ය නම් සෑම විටම තීරු අන්වර්ථ කළ යුතුය. එබැවින් ආරම්භ කිරීම සඳහා ඔබට එය නිසි ලෙස නම් කළ හැකි කාලය නාස්තියක් බවට පත්වේ. අනවශ්ය වැඩ කිරීමේ අමතර බරක් නොමැතිව මෙම සංකීර්ණ විමසුම් ප්රමාණවත් නොවේ (මම පේළි සිය ගණනක් දිග විය හැකි විමසුම් ලියමි).
එය කේත දෝෂ ඇති කිරීමට යටත් වේ. ඔබ ස්වාභාවික බැඳීම භාවිතා කිරීමට ඉඩ දෙන දත්ත සමුදායක් භාවිතා කරන්නේ නම් (ඔබ එය කවදා හෝ භාවිතා කළ යුතු යැයි මම නොසිතමි, නමුත් විශේෂාංග ඇති විට කවුරුහරි ඒවා භාවිතා කරනු ඇත), ඔබ එය භාවිතා කරන සංවර්ධකයෙකු ලබා ගන්නේ නම් ඔබ වැරදි දෙයට සම්බන්ධ වනු ඇත.
ඔබ සංකීර්ණ විමසුමක් නිර්මාණය කිරීම සඳහා බැඳීම් පිටපත් කරන්නේ නම්, අන්වර්ථය ඔබට අවශ්ය පරිදි වෙනස් කර වැරදි සම්බන්ධතාවයක් ලබා ගැනීම අමතක කිරීම පහසුය. සෑම හැඳුනුම්පතක්ම එහි ඇති වගුවට නම් කර ඇත්නම්, එවිට ඔබට සාමාන්යයෙන් සින්ටැක්ස් දෝෂයක් ලැබෙනු ඇත. පීපීකේ නම සහ එෆ්කේ නම ගැලපෙන්නේ නම් එක්වන ඉනා සංකීර්ණ විමසුම වැරදියි නම් හඳුනා ගැනීම පහසුය.
ID
මට කිසිසේත් ඒත්තු ගැන්වෙන්නේ නැත.
වගුවක ඇති ප්රාථමික යතුර සඳහා තීරු නාමය ලෙස "හැඳුනුම්පත" භාවිතා නොකිරීමට වඩාත්ම වැදගත් හේතුව ලෙස මා සලකන දෙයට ප්රවේශ වන පිළිතුරු කිහිපයක් ඇත: එනම් අනුකූලතාව සහ අඩු අපැහැදිලි බව.
කෙසේ වෙතත්, මට ප්රධාන වාසිය වන්නේ නඩත්තු ක්රමලේඛකයා, විශේෂයෙන් මුල් සංවර්ධනය සමඟ සම්බන්ධ නොවූ අයෙකි. පුද්ගල වගුවේ ඇති හැඳුනුම්පත සඳහා ඔබ "PersonID" යන නම භාවිතා කර එම නම විදේශීය යතුරක් ලෙස නිරන්තරයෙන් භාවිතා කළේ නම්, එම "PersonID" යන්න අනුමාන නොකොට PersonID සතුව ඇති වගු මොනවාදැයි සොයා ගැනීමට ක්රමයට එරෙහිව විමසුමක් ලිවීම සුළුපටු ය. එය විදේශීය යතුරක් වන විට භාවිතා කරන නමයි. මතක තබා ගන්න, හරි හෝ වැරදි, විදේශීය ප්රධාන සම්බන්ධතා සෑම ව්යාපෘතියකම සෑම විටම ක්රියාත්මක නොවේ.
එක් වගුවකට එකම වගුවකට විදේශීය යතුරු දෙකක් තිබිය යුතු දාර නඩුවක් ඇත, නමුත් එවැනි අවස්ථාවලදී මම මුල් යතුරු නාමය තීරුවේ උපසර්ග නාමය ලෙස තබමි, එබැවින් ආදේශක කාඩ් ගැලපීමක් වන% PersonID පහසුවෙන් සොයාගත හැකිය එම අවස්ථා ද වේ.
ඔව්, මෙයින් බොහෝමයක් ඉටු කළ හැක්කේ "හැඳුනුම්පත" සහ සෑම විටම එය "tableNameID" ලෙස භාවිතා කිරීමට දැන සිටීමෙනි, නමුත් ඒ සඳහා පුහුණුවීම් පවතින බව දැන ගැනීම සහ මුල් සංවර්ධකයින් මත පදනම්ව අනුගමනය කළ යුතුය. ප්රත්යක්ෂ සම්මත පුහුණුව.
දිගු තීරු නම් ලිවීමට අමතර යතුරු පහරවල් කිහිපයක් අවශ්ය බව සමහර අය පෙන්වා දී ඇති නමුත්, කේතය ලිවීම වැඩසටහනේ ක්රියාකාරී ජීවිතයේ සුළු කොටසක් පමණක් බව මම ප්රකාශ කරමි. සංවර්ධක යතුරු එබීම සුරැකීම ඉලක්කය නම්, අදහස් කිසි විටෙකත් ලිවිය යුතු නොවේ.
වගු සිය ගණනක් සහිත විශාල ව්යාපෘති නඩත්තු කිරීමට වසර ගණනාවක් ගත කර ඇති අයෙකු ලෙස, වගු හරහා යතුරක් සඳහා ස්ථාවර නම් වලට මම තදින්ම කැමැත්තෙමි.
Companies
වගුවකට මේසයකට විදේශීය යතුරු 2 ක් ඇතැයි සිතමු Persons
. එක් අයෙකු සමාගමේ සභාපති නියෝජනය කරයි; අනෙක සමාගමේ භාණ්ඩාගාරික නියෝජනය කරයි. ඔබ ඇත්තටම තීරු කතා කරනවාද PersonID1
හා PersonID2
? එය වඩා විස්තරාත්මක ඔවුන් අමතන්න වනු ඇත PresidentID
හා TreasurerID
. මට කියවීමට inner join Person AS Presidents ON Company.PresidentID = Presidents.ID
වඩා පහසු බව පෙනේinner join Person AS Person1 ON Company.PersonID1 = Person1.PersonID
CompanyOfficer
හෝ CompanyPerson
අතර සමග බොහෝ-බහු සම්බන්ධතාව ඉඩ සලසා දෙයි මේසය Company
හා Person
සම්බන්ධය ස්වභාවය ගැන අතිරේක තොරතුරු සමඟ. මම තුළ එය ක්රියාත්මක කිරීමට නම් Company
මේසය, මම තීරුව නම් භාවිතා කරන PresidentPersonID
හා TreasurerPersonID
අතිරේක descriptor එකතු වන අතර නම * PersonID කොටසක් ආරක්ෂා කිරීමට. inner join Person as Presidents on Company.PresidentPersonID = Presidents.PersonID
මූලික යතුරු ක්ෂේත්රය ලෙස හැඳුනුම්පත භාවිතා කිරීමේ පුරුද්ද සෑම වගුවකටම හැඳුනුම්පත එකතු වන භාවිතයට මඟ පාදයි. බොහෝ වගු වල දැනටමත් අද්විතීය තොරතුරු ඇත, එය වාර්තාවක් අද්විතීය ලෙස හඳුනා ගනී. එය සෑම යතුරකටම එකතු කරන හැඳුනුම් ක්ෂේත්රයක් නොව ප්රාථමික යතුරක් ලෙස භාවිතා කරන්න. එය සම්බන්ධතා දත්ත සමුදායන්ගේ පදනම් වලින් එකකි.
හැඳුනුම්පත භාවිතා කිරීම නරක පුරුද්දක් වන්නේ එබැවිනි: හැඳුනුම්පත බොහෝ විට ස්වයංක්රීය ස්වයංක්රීය තොරතුරු නොවේ.
පහත වගු සලකා බලන්න:
PK id | Countryid | Countryname
1 | 840 | United States
2 | 528 | the Netherlands
මෙම වගුවේ ඇති වැරැද්ද නම්, එය පරිශීලකයාට තවත් පේළියක් එක් කිරීමට ඉඩ සලසයි: එක්සත් ජනපදය, රට කේත 840 සමඟ. එය සම්බන්ධතා අඛණ්ඩතාව බිඳ දැමීය. ඔබට තනි තීරුවල සුවිශේෂත්වය බලාත්මක කළ හැකිය, නැතහොත් ඔබට දැනටමත් ලබා ගත හැකි ප්රාථමික යතුරක් භාවිතා කළ හැකිය:
PK Countryid | Countryname
840 | United States
528 | the Netherlands
මේ ආකාරයට ඔබ දැනටමත් ඇති තොරතුරු ප්රාථමික යතුරක් ලෙස භාවිතා කරයි, එය සම්බන්ධතා දත්ත සමුදායේ හදවතේ ඇත.
එය නිසි ලෙස භාවිතා කරන්නේ නම් එය නරක පුරුද්දක් යැයි මම නොසිතමි. ඔබට කිසි විටෙකත් ස්පර්ශ නොකළ යුතු "හැඳුනුම්පත" නමින් ස්වයංක්රීයව වැඩෙන හැඳුනුම් ක්ෂේත්රයක් තිබීම සාමාන්ය දෙයක් වන අතර යෙදුම සඳහා මිත්රශීලී හඳුනාගැනීමක් භාවිතා කරන්න. වැනි කේත ලිවීම ටිකක් කරදරකාරී විය හැකියfrom tableA a inner join tableB b on a.id = b.a_id
හැකි නමුත් එම කේතය ඉවතට ගත හැකිය.
පුද්ගලික මනාපයක් ලෙස මම හැඳුනුම්පතෙහි නම සමඟ උපසර්ගය යෙදීමට නැඹුරු වෙමි, නමුත් Id
එය සම්පූර්ණයෙන්ම දත්ත සමුදායෙන් හසුරුවන්නේ නම් භාවිතා කිරීම පිළිබඳ සැබෑ ගැටළුවක් මා දකින්නේ නැත .
හැඳුනුම්පත ප්රමාණවත් තරම් පොදු ය, එය කිසිවෙකු ව්යාකූල කරනු ඇතැයි මම නොසිතමි. ඔබට සෑම විටම මේසය දැන ගැනීමට අවශ්ය වනු ඇත. වගු / අන්වර්ථයක් ඇතුළත් නොකර ක්ෂේත්ර නාම නිෂ්පාදන කේතයට ඇතුළත් කිරීම නරක පුරුද්දකි. තාවකාලික විමසුම් ඉක්මනින් ටයිප් කිරීමට හැකිවීම ගැන ඔබ ඕනෑවට වඩා සැලකිලිමත් වන්නේ නම්, ඔබ තනිවම සිටී.
හැඳුනුම්පත වෙන් කර ඇති වචනයක් වන කිසිවෙකු වර්ග අඩි දත්ත ගබඩාවක් සංවර්ධනය නොකරනු ඇතැයි සිතමු.
CREATE TABLE CAR (ID);
ක්ෂේත්රයේ නම, ප්රාථමික යතුර සහ ස්වයංක්රීය වර්ධක 1 න් 1 කින් ආරම්භ කර එක ලස්සන කුඩා අකුරු 2 කින් සමන්විත වේ. ඔහ්, මම එය CARS ලෙස හඳුන්වනු ඇත, නමුත් අපි යතුරු පහරවල් වලින් ඉතිරි කර ගැනීමට යන්නේ නම් සහ CAR නම් වගුවකට ඇත්තේ එකක් පමණක් යැයි සිතන්නේ කවුද?
Car
නිරූපණය කරන්නේ Table
එක් එක් Row
තනි නියෝජනය කරන ස්ථානයකි Car
. කරන මා ෙවත පවරා ඇති Cars
විධිමත් සමගද න්යාය මූලික විදුහල්පතිවරුන් අවබෝධය සම්පූර්ණ නොමැතිකම අර්ථ විචාර හා දර්ශන වෙනස් වෙනවා. රේල්ස් යනු භයානක වීමට තරම් දැන සිටි කෙනෙකුගේ ප්රධාන උදාහරණයකි .
මෙම ප්රශ්නය නැවත නැවතත් පහර දී ඇත, නමුත් මම ද මගේ මතය එකතු කරනු ඇතැයි සිතුවෙමි.
මම හැඳුනුම්පත භාවිතා කරන්නේ එය එක් එක් වගුව සඳහා හඳුනාගැනීමේ යන්ත්රයයි, එබැවින් මම මේසයකට සම්බන්ධ වූ විට මට ප්රාථමික යතුර අවශ්ය වූ විට මම ස්වයංක්රීයව ප්රාථමික යතුරට සම්බන්ධ වෙමි.
හැඳුනුම් ක්ෂේත්රය ස්වයංක්රීය අත්සන් කිරීමකි, අත්සන් නොකෙරේ (මෙයින් අදහස් කරන්නේ මා කිසි විටෙකත් එහි වටිනාකම සැකසිය යුතු නැති අතර එය negative ණ විය නොහැකි බවයි)
විදේශීය යතුරු සඳහා, මම මේස නාමය භාවිතා කරමි (නැවතත් විලාසිතාවේ කාරණයක්), නමුත් මා සම්බන්ධ වන මූලික යතුර වන්නේ වගුවේ හැඳුනුම් ක්ෂේත්රයයි, එබැවින් අනුකූලතාව යනු මට සෑම විටම පහසුවෙන් විමසීම් පරීක්ෂා කළ හැකිය
id ද කෙටි හා මිහිරි ය
අතිරේක සම්මුතිය - සියලුම වගු සහ තීරු නම් සඳහා කුඩා අකුරු භාවිතා කරන්න, එබැවින් නඩුව හේතුවෙන් ගැටළු සොයාගත නොහැක
සලකා බැලිය යුතු තවත් දෙයක් නම්, ප්රාථමික යතුරු නාමය විදේශීය යතුරු නාමයට වඩා වෙනස් නම්, සමහර තෙවන පාර්ශවීය මෙවලම් භාවිතා කළ නොහැක.
උදාහරණයක් ලෙස, ඔබේ යෝජනා ක්රමය විසියෝ වැනි මෙවලමකට පැටවීමට නොහැකි වන අතර එය නිවැරදි ඊආර්ඩී නිපදවයි.
මෙහි සිටින පුද්ගලයින් සෑම අංශයක්ම ආවරණය වන බව මට පෙනේ, නමුත් මට අවශ්ය වන්නේ “හැඳුනුම්පත” නොවන අතර එය “අනන්යතාවය” ලෙස කියවිය යුතු නොවේ. එය “දර්ශකයක්” වන අතර නිසැකවම එය පේළියේ අනන්යතාවය සඳහන් නොකරයි. (මම මෙහි වැරදි වචන භාවිතා කර ඇති අතර, කරුණාකර මා නිවැරදි කළේ නම්)
මිනිසුන් වගු දත්ත කියවන ආකාරය සහ ඔවුන්ගේ කේතය ලියන ආකාරය වැඩි වශයෙන් හෝ අඩුය. මා පෞද්ගලිකව හා බොහෝ විට මෙය වඩාත් නිතර දකින වඩාත් ජනප්රියම ක්රමය වන්නේ කේත රචකයන් විසින් සම්පුර්ණ සඳහනක් ලිවීමයි table.id
, ඔවුන්ට වෘත්තීය සමිති හෝ / හා සම්බන්ධ වීමට අවශ්ය නොවුවද. උදාහරණයක් වශයෙන්:
SELECT cars.color, cars.model FROM cars WHERE cars.id = <some_var>
එමඟින් ඔබට එය ඉංග්රීසි භාෂාවට පරිවර්තනය කළ හැකිය "අංකනය කර ඇති එම මෝටර් රථයේ වර්ණය හා ආකෘතිය මට දෙන්න." "අංකයක් ලෙස හඳුනාගෙන ඇති එම මෝටර් රථයේ වර්ණය හා ආකෘතිය මට දෙන්න" ලෙස නොවේ. හැඳුනුම්පත කිසිදු ආකාරයකින් මෝටර් රථය නියෝජනය නොකරයි, එය මෝටර් රථයේ දර්ශකය පමණි, ඔබට අවශ්ය නම් අනුක්රමික අංකය පමණි. ඔබට අරාවකින් තුන්වන අංගය ගැනීමට අවශ්ය වූ විට මෙන්.
එබැවින් මට එකතු කිරීමට අවශ්ය දේ සාරාංශ කිරීම යනු එය මනාපයක් පමණක් වන අතර විස්තර කර ඇති SQL කියවීමේ ක්රමය වඩාත් ජනප්රියය.
කෙසේ වෙතත්, මෙය භාවිතා නොකරන සමහර අවස්ථා තිබේ, (වඩා දුර්ලභ උදාහරණයක්) හැඳුනුම්පත යනු සැබවින්ම විස්තර කරන නූලක් වන විට. උදාහරණයක් ලෙස id = "RedFordMustang1970"
හෝ ඒ හා සමාන දෙයක්. අවම වශයෙන් අදහස ලබා ගැනීම සඳහා මට මෙය පැහැදිලි කළ හැකි යැයි මම විශ්වාස කරමි.