คำถามติดแท็ก primary-key

ในการออกแบบฐานข้อมูลเชิงสัมพันธ์คีย์หลักสามารถระบุแต่ละแถวในตารางโดยไม่ซ้ำกัน คีย์หลักประกอบด้วยคอลัมน์เดียวหรือชุดของคอลัมน์

8
เหตุใดค่าคีย์หลักจึงเปลี่ยนไป
ฉันได้ค้นคว้าแนวคิดของ ROWGUID เมื่อเร็ว ๆ นี้และได้พบกับคำถามนี้ คำตอบนี้ให้ข้อมูลเชิงลึก แต่ทำให้ฉันลงหลุมกระต่ายที่แตกต่างกับการกล่าวถึงการเปลี่ยนค่าคีย์หลัก ความเข้าใจของฉันคือกุญแจหลักที่ไม่ควรเปลี่ยนและการค้นหาของฉันตั้งแต่การอ่านคำตอบนี้ได้ให้คำตอบที่สะท้อนการปฏิบัติที่ดีที่สุดเท่านั้น ค่าคีย์หลักจะต้องมีการเปลี่ยนแปลงภายใต้สถานการณ์ใดหลังจากสร้างเรคคอร์ดแล้ว

4
ทางออกที่ดีที่สุดในการแก้ไขการออกแบบฐานข้อมูลด้วย GUID เป็นคีย์หลัก
ฉันหลังจากการยืนยันแนวคิดนี้เพื่อแก้ไขฐานข้อมูลที่มีประสิทธิภาพไม่ดีหรือมีข้อเสนอแนะที่ดีกว่าถ้ามีใครมี เปิดรับข้อเสนอแนะที่ดีกว่าเสมอ ฉันมีฐานข้อมูลขนาดใหญ่มาก (มากกว่า 20 ล้านบันทึกการเติบโตประมาณ 1/2 ล้านต่อวัน) ซึ่งใช้ GUID เป็น PK การดูแลในส่วนของฉัน แต่ PK นั้นทำคลัสเตอร์บนเซิร์ฟเวอร์ SQL และทำให้เกิดปัญหาประสิทธิภาพการทำงาน เหตุผลสำหรับ guid - ฐานข้อมูลนี้มีการซิงโครไนซ์บางส่วนกับฐานข้อมูลอื่น 150 ฐานดังนั้น PK จึงจำเป็นต้องไม่ซ้ำกัน การซิงโครไนซ์ไม่ได้รับการจัดการโดย SQL Server แต่มีกระบวนการแบบกำหนดเองที่สร้างขึ้นซึ่งเก็บข้อมูลให้ตรงกับความต้องการของระบบ - ทั้งหมดขึ้นอยู่กับ GUID นั้น ฐานข้อมูลระยะไกล 150 ตัวแต่ละตัวไม่เก็บข้อมูลแบบเต็มตามที่เก็บไว้ในฐานข้อมูล SQL ส่วนกลาง พวกเขาจัดเก็บชุดย่อยของข้อมูลที่พวกเขาต้องการจริงและข้อมูลที่ต้องการนั้นไม่ซ้ำกัน (10 จาก 150 ฐานข้อมูลอาจมีบางระเบียนเดียวกันจากฐานข้อมูลไซต์อื่นเช่นพวกเขาแบ่งปัน) นอกจากนี้ - ข้อมูลถูกสร้างขึ้นจริงที่ไซต์ระยะไกล - ไม่ใช่ที่จุดศูนย์กลาง - …

4
ดึง PK และ FK ทั้งหมด
ฉันมีฐานข้อมูลขนาดใหญ่ที่ฉันต้องการแยกคีย์หลักและคีย์ต่างประเทศทั้งหมดจากแต่ละตาราง ฉันมี pgAdmin III มีวิธีการทำเช่นนี้โดยอัตโนมัติและไม่ข้ามแต่ละตารางด้วยตนเอง?


2
ไม่มีการใช้ดัชนีคีย์หลักที่มี DATETIME เนื่องจากส่วนแรกของคีย์ผสม
ฉันมีปัญหากับการทำดัชนีเวลา (หรือแม้กระทั่งวันที่) เป็นส่วนแรกของคีย์หลักของฉัน ฉันใช้ MySQL 5.5 นี่คือสองตารางของฉัน: -- This is my standard table with dateDim as a dateTime CREATE TABLE `stats` ( `dateDim` datetime NOT NULL, `accountDim` mediumint(8) unsigned NOT NULL, `execCodeDim` smallint(5) unsigned NOT NULL, `operationTypeDim` tinyint(3) unsigned NOT NULL, `junkDim` tinyint(3) unsigned NOT NULL, `ipCountryDim` smallint(5) unsigned NOT …

2
มีความแตกต่างที่มีตัวตนระหว่างดัชนีคลัสเตอร์ที่ไม่ซ้ำกันและคีย์หลักที่คลัสเตอร์หรือไม่
ฉันเข้าใจว่าอาจมีความแตกต่างในความหมายหรือเจตนาระหว่างทั้งสอง แต่มีความแตกต่างด้านพฤติกรรมหรือประสิทธิภาพระหว่างคีย์หลักที่คลัสเตอร์และดัชนีที่ไม่ซ้ำกันหรือไม่

4
มีประโยชน์ใด ๆ ของคีย์หลักที่ประกอบด้วยคอลัมน์ทั้งหมดของตารางหรือไม่
ฉันมีตารางที่มีสี่คอลัมน์ที่ไม่เป็นโมฆะและข้อมูลเป็นเช่นนั้นทั้งสี่จำเป็นต้องแยกแยะระเบียนที่ไม่ซ้ำกัน หมายความว่าถ้าฉันจะสร้างคีย์หลักมันจะต้องประกอบด้วยคอลัมน์ทั้งหมด การค้นหาเทียบกับตารางเกือบทุกครั้งที่จะดึงระเบียนเดียวเช่นคอลัมน์ทั้งหมดจะถูกกรองในแบบสอบถาม เนื่องจากทุกคอลัมน์จะต้องทำการค้นหาการมีคีย์หลักมีประโยชน์กับฉันหรือไม่ (นอกจากบังคับให้มีการบันทึกที่ไม่ซ้ำกัน)?

2
ดัชนีในคีย์หลักไม่ได้ใช้ในการเข้าร่วมง่าย
ฉันมีคำนิยามตารางและดัชนีต่อไปนี้: CREATE TABLE munkalap ( munkalap_id serial PRIMARY KEY, ... ); CREATE TABLE munkalap_lepes ( munkalap_lepes_id serial PRIMARY KEY, munkalap_id integer REFERENCES munkalap (munkalap_id), ... ); CREATE INDEX idx_munkalap_lepes_munkalap_id ON munkalap_lepes (munkalap_id); ทำไมไม่มีดัชนีใน munkalap_id ที่ใช้ในการสืบค้นต่อไปนี้? EXPLAIN ANALYZE SELECT ml.* FROM munkalap m JOIN munkalap_lepes ml USING (munkalap_id); QUERY PLAN Hash …

4
ฉันจะแปลงคีย์ในรายงานการหยุดชะงักของ SQL Server เป็นค่าได้อย่างไร
ฉันมีรายงานการหยุดชะงักที่บอกฉันว่ามีข้อขัดแย้งเกี่ยวกับ waitresource = "KEY: 9: 72057632651542528 (543066506c7c)" และฉันเห็นสิ่งนี้: <keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528"> ภายใน <resource-list> ฉันต้องการที่จะหาค่าที่แท้จริงสำหรับคีย์ (id = 12345 เป็นต้น) ฉันต้องใช้คำสั่ง SQL อะไรในการรับข้อมูลนั้น

4
เหตุใดจึงต้องมีการระบุคีย์
ฉันใหม่มากในเรื่องของฐานข้อมูลดังนั้นนี่อาจฟังดูงมงาย แต่ฉันอยากรู้ว่าทำไมคีย์ควรมีความชัดเจนภายในตาราง สิ่งนี้เป็นหลักเพื่อบอกผู้ใช้หรือไม่ว่ามูลค่าของคอลัมน์ที่ให้นั้นรับประกันว่าจะไม่ซ้ำกันภายในแต่ละแถว ความเป็นเอกลักษณ์ควรอยู่ที่นั่นแม้ว่าจะไม่ได้กล่าวถึงก็ตาม

4
เรียงลำดับที่ระบุในคีย์หลัก แต่การเรียงลำดับจะถูกดำเนินการบน SELECT
ฉันจัดเก็บข้อมูลเซ็นเซอร์ในตารางSensorValues ตารางและคีย์หลักมีดังนี้: CREATE TABLE [dbo].[SensorValues]( [DeviceId] [int] NOT NULL, [SensorId] [int] NOT NULL, [SensorValue] [int] NOT NULL, [Date] [int] NOT NULL, CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED ( [DeviceId] ASC, [SensorId] ASC, [Date] DESC ) WITH ( FILLFACTOR=75, DATA_COMPRESSION = PAGE, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY …

2
แนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับตารางการค้นหาในฐานข้อมูลเชิงสัมพันธ์คืออะไร
ตารางการค้นหา (หรือตารางรหัสตามที่บางคนเรียกพวกเขา) มักจะเป็นชุดของค่าที่เป็นไปได้ที่สามารถกำหนดสำหรับคอลัมน์ที่แน่นอน ตัวอย่างเช่นสมมติว่าเรามีตารางการค้นหาที่เรียกว่าparty(หมายถึงการเก็บข้อมูลเกี่ยวกับพรรคการเมือง) ที่มีสองคอลัมน์: party_code_idnซึ่งเก็บค่าตัวเลขที่ระบบสร้างขึ้นและ (ขาดความหมายโดเมนธุรกิจ ) ทำงานเป็นตัวแทนสำหรับคีย์จริง party_codeเป็นกุญแจจริงหรือ "ธรรมชาติ" ของตารางเนื่องจากจะรักษาค่าที่มีนัยยะของโดเมนธุรกิจ และให้เราบอกว่าตารางดังกล่าวเก็บข้อมูลที่ตามมา: +----------------+------------+ | party_code_idn | party_code | +----------------+------------+ | 1 | Republican | | 2 | Democratic | +----------------+------------+ party_codeคอลัมน์ซึ่งช่วยให้ค่า 'รีพับลิกัน' และ 'ประชาธิปไตย' เป็นสำคัญที่แท้จริงของตารางมีการตั้งค่าที่มีข้อ จำกัด ที่ไม่ซ้ำกัน แต่ผมเลือกที่จะเพิ่มparty_code_idnและกำหนดเป็น PK ของตาราง (แม้ว่าเหตุผลที่พูด , party_codeอาจทำงานเป็นคีย์หลัก [PK]) คำถาม แนวปฏิบัติที่เหมาะสมที่สุดสำหรับการชี้ไปยังค่าการค้นหาจากตารางธุรกรรมคืออะไร ฉันควรสร้างการอ้างอิงต่างประเทศ (FK) อ้างอิงทั้ง(a)โดยตรงกับค่าที่เป็นธรรมชาติและมีความหมายหรือ(b)เพื่อแทนค่า? …

5
GUID ตามลำดับหรือใหญ่สำหรับตารางฐานข้อมูล 'ใหญ่' PK
ฉันรู้ว่าคำถามประเภทนี้เกิดขึ้นมากมาย แต่ฉันยังไม่ได้อ่านข้อโต้แย้งที่น่าสนใจใด ๆ เพื่อช่วยในการตัดสินใจ กรุณาทนกับฉัน! ฉันมีฐานข้อมูลขนาดใหญ่ - มันเติบโตประมาณ 10,000,000 รายการต่อวัน ข้อมูลมีความสัมพันธ์และสำหรับเหตุผลด้านประสิทธิภาพฉันโหลดตารางด้วย BULK COPY ด้วยเหตุนี้ฉันจำเป็นต้องสร้างคีย์สำหรับแถวและไม่สามารถพึ่งพาคอลัมน์ตัวตน เลขจำนวนเต็ม 64- บิต - ใหญ่ - กว้างพอสำหรับฉันที่จะใช้ แต่เพื่อรับประกันเอกลักษณ์ฉันต้องมีเครื่องกำเนิดส่วนกลางเพื่อสร้าง ID ของฉันให้ฉัน ขณะนี้ฉันมีบริการตัวสร้างซึ่งอนุญาตให้บริการสำรองหมายเลขลำดับ X และรับประกันว่าไม่มีการชนกัน อย่างไรก็ตามผลที่ตามมาก็คือบริการทั้งหมดที่ฉันเชื่อถือได้จากเครื่องกำเนิดไฟฟ้าส่วนกลางนี้และดังนั้นฉันจึงถูก จำกัด ในวิธีที่ฉันสามารถกระจายระบบของฉันและฉันไม่พอใจกับการพึ่งพาอื่น ๆ (เช่นต้องใช้การเข้าถึงเครือข่าย) โดยการออกแบบนี้ นี่เป็นปัญหาในบางโอกาส ตอนนี้ฉันกำลังพิจารณาการใช้ GUID ตามลำดับเป็นคีย์หลักของฉัน (สร้างจาก SQL ภายนอก) เท่าที่ฉันสามารถตรวจสอบได้จากการทดสอบของฉันเองข้อเสียเปรียบเพียงอย่างเดียวคือค่าใช้จ่ายในพื้นที่ดิสก์ของประเภทข้อมูลที่กว้างขึ้น (ซึ่งเป็นที่มาจากการใช้งานในดัชนี) ฉันไม่ได้เห็นการชะลอตัวที่มองเห็นได้ในประสิทธิภาพการค้นหาเมื่อเทียบกับทางเลือกที่ใหญ่ การโหลดตารางด้วย BULK COPY ช้ากว่าเล็กน้อย แต่ไม่มากนัก ดัชนีที่ใช้ GUID …

4
เพิ่มการรวมอัตโนมัติลงใน PK ที่มีอยู่
ฉันสร้างตารางในฐานข้อมูลที่มีอยู่แล้วในฐานข้อมูลอื่น เริ่มแรกมีการเติมข้อมูลฐานข้อมูลเก่า PK ของตารางจะต้องได้รับค่าที่มีอยู่แล้วในบันทึกเหล่านั้นดังนั้นจึงไม่สามารถสร้างอัตโนมัติได้ ตอนนี้ฉันต้องการตารางใหม่เพื่อให้มี PK เป็น autoincrement แต่ฉันจะทำอย่างนั้นหลังจากที่มี PK อยู่แล้วและมีข้อมูลได้อย่างไร

5
แบ่งปันลำดับคีย์หลักเดียวข้ามฐานข้อมูลหรือไม่
เป็นวิธีปฏิบัติที่ยอมรับได้หรือไม่ในการใช้ลำดับเดียวเป็นคีย์หลักในทุกตาราง (แทนที่จะเป็นคีย์หลักที่มีลักษณะเฉพาะสำหรับตารางที่กำหนด ถ้าเป็นเช่นนั้นจะเป็นการดีกว่าการใช้ลำดับคีย์หลักเดียวในตาราง ฉันเป็นผู้พัฒนาซอฟต์แวร์รุ่นเยาว์ไม่ใช่ DBA ดังนั้นฉันยังคงเรียนรู้พื้นฐานการออกแบบฐานข้อมูลที่ดีมากมาย แก้ไข: ในกรณีที่มีใครสงสัยฉันเพิ่งอ่านบทวิจารณ์ของการออกแบบฐานข้อมูลโดยหนึ่งใน DBA ของ บริษัท ของเราซึ่งกล่าวว่าเป็นปัญหาที่การออกแบบไม่ได้ใช้คีย์หลักเดียวในฐานข้อมูลทั้งหมดซึ่งฟังดูแตกต่างจากสิ่งที่ ฉันเรียนมาแล้ว แก้ไข 2: เพื่อตอบคำถามในความคิดเห็นนี่สำหรับ Oracle 11g แต่ฉันสงสัยในระดับที่ไม่ใช่ฐานข้อมูล หากคำถามนี้ขึ้นอยู่กับฐานข้อมูลฉันจะสนใจที่จะรู้ว่าทำไม แต่ในกรณีเช่นนี้ฉันจะหาคำตอบเฉพาะสำหรับ Oracle

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.