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

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

4
Mysql int vs varchar เป็นคีย์หลัก (InnoDB Storage Engine?
ฉันสร้างเว็บแอปพลิเคชัน (ระบบการจัดการโครงการ) และฉันสงสัยเกี่ยวกับสิ่งนี้เมื่อพูดถึงประสิทธิภาพ ฉันมีตารางปัญหาอยู่ข้างในนั้นมี 12 ปุ่มต่างประเทศที่เชื่อมโยงกับตารางอื่น ๆ ในบรรดา 8 คนนั้นฉันต้องเข้าร่วมเพื่อรับฟิลด์ชื่อเรื่องจากตารางอื่น ๆ เพื่อให้ระเบียนมีเหตุผลในแอปพลิเคชันเว็บ 1 ฟิลด์สำหรับการรวมแต่ละรายการ ตอนนี้ฉันยังได้รับคำสั่งให้ใช้คีย์หลักที่เพิ่มขึ้นอัตโนมัติ (ยกเว้นการใช้เศษเป็นข้อกังวลในกรณีที่ฉันควรใช้ GUID) สำหรับเหตุผลด้านความคงทน แต่มันแย่ขนาดไหนในการใช้ varchar (ความยาวสูงสุด 32) ฉันหมายถึงส่วนใหญ่ของตารางเหล่านี้อาจไม่ได้มีการบันทึกจำนวนมาก (ส่วนใหญ่ควรต่ำกว่า 20) นอกจากนี้ถ้าฉันใช้ชื่อเป็นคีย์หลักฉันจะไม่ต้องรวม 95% ของเวลาดังนั้นสำหรับ 95% ของ sql ฉันจะเกิดผลการทำงานที่ยอดเยี่ยม (ฉันคิดว่า) ข้อเสียอย่างเดียวที่ฉันคิดได้ก็คือฉันมีคือฉันจะมีการใช้พื้นที่ดิสก์ที่สูงขึ้น เหตุผลที่ฉันใช้ตารางการค้นหาสำหรับสิ่งนี้มากมายแทนที่จะเป็น enums ก็เพราะฉันต้องการค่าทั้งหมดเหล่านี้เพื่อกำหนดค่าโดยผู้ใช้ผ่านแอปพลิเคชันเอง อะไรคือข้อเสียของการใช้ varchar เป็นคีย์หลักสำหรับตารางที่ไม่ได้ยกเว้นที่จะมีหลายระเบียน? อัพเดท - การทดสอบบางอย่าง ดังนั้นฉันจึงตัดสินใจทำการทดสอบเบื้องต้นเกี่ยวกับสิ่งนี้ ฉันมีบันทึก 100,000 รายการและนี่คือการสืบค้นพื้นฐาน: แบบสอบถาม VARCHAR FK …

2
วิธีการเลื่อนระดับดัชนีที่มีอยู่เป็นคีย์หลักใน PostgreSQL
ฉันรู้วิธีสร้างคีย์หลักภายในตาราง แต่ฉันจะสร้างดัชนีที่มีอยู่เป็นคีย์หลักได้อย่างไร ฉันพยายามที่จะคัดลอกตารางที่มีอยู่จากฐานข้อมูลหนึ่งไปยังอีก เมื่อฉันแสดงตารางดัชนีที่ด้านล่างจะอยู่ในรูปแบบนี้: "my_index" PRIMARY KEY, btree (column1, column2) ฉันได้สร้างดัชนีโดย: CREATE INDEX my_index ON my_table (column1, column2) แต่ฉันไม่ทราบวิธีการทำให้เป็นคีย์หลัก ... อัปเดต: เวอร์ชันของเซิร์ฟเวอร์ของฉันคือ 8.3.3

2
มีการจัดการคีย์ auto_increment ใน INSERT อย่างไร (เลือก * จาก ... )
ฉันมีtable1และtable2ใน MySQL ทั้งสองมีหลักสำคัญauto_incrementid หากตาราง schemas ตรงกันและฉันจะINSERT INTO table1 (SELECT * FROM table2)เกิดอะไรขึ้นเกี่ยวกับแถวใหม่ที่แทรกเข้าไปtable1? พวกเขาเก็บidค่าเก่าของพวกเขาและสร้างความขัดแย้งเมื่อแถวจากtable1มีเหมือนกันidหรือไม่ ค่าใหม่ถูกสร้างขึ้นโดย auto_increment หรือไม่ มันขึ้นอยู่กับเครื่องมือจัดเก็บหรือล็อค?

1
คีย์หลักหลายตัวใน PostgreSQL
ฉันมีตารางต่อไปนี้: CREATE TABLE word( word CHARACTER VARYING NOT NULL, id BIGINT NOT NULL, repeat INTEGER NOT NULL ); ALTER TABLE public.word OWNER TO postgres; ALTER TABLE ONLY word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id); เมื่อฉันพยายามกู้คืนโดยใช้คำสั่งต่อไปนี้: psql -U postgres -h localhost -d word -f word.sql มันทำให้ฉันมีข้อผิดพลาดนี้: ไม่อนุญาตให้ใช้คีย์หลักหลายตัวสำหรับตาราง "คำ" ฉันจะใช้หลายคีย์หลักใน postgres ได้อย่างไร

4
คีย์หลัก 5+ คอลัมน์ไม่ดีสำหรับตารางขนาดใหญ่ (100 ล้าน+) หรือไม่
ฉันกำลังอ่านเกี่ยวกับปัญหา DB ของชีวิตจริงและโครงการหนึ่งมี 100 ล้านแถวรวมตารางที่มีคอลัมน์ 5 คอลัมน์เป็นหลัก ฉันคิดว่านี่เป็นสิ่งที่ไม่ดี แต่ทุกคนสามารถบอกฉันได้ว่าทำไม ตารางนั้นเป็นตารางการรวบรวม / การรวมขนาดเล็กดังนั้น 5 คอลัมน์จึงเป็นเช่น (วัน, market_id, product_id ... ) ตอนแรกฉันคิดว่าคีย์หลัก 5 คอลัมน์ไม่เหมาะ แต่ยิ่งฉันคิดฉันก็ไม่สามารถคิดหาเหตุผลที่ดีได้ นี่เป็นการสนทนาช่วงดึกกับวิศวกรของ บริษัท ครึ่งหนึ่ง มีคนพูดถึงเรื่องนี้ว่าเป็นการออกแบบที่ไม่ดีวิศวกรอาวุโสคนหนึ่งเห็นด้วย แต่ก็ไม่มีใครโดดขึ้นไปเลย ดังนั้นพยายามค้นคว้าเรื่องด้วยตัวเอง!

2
ประสิทธิภาพของคีย์หลักคอมโพสิตเป็นคีย์ต่างประเทศ
ฉันมีตารางที่มีคีย์หลักคอมโพสิต (ประกอบด้วย 4 คอลัมน์) ซึ่งใช้เพื่อให้แน่ใจว่าไม่มีรายการที่ซ้ำกันถูกป้อนลงในตาราง ตอนนี้ฉันต้องการโต๊ะใหม่ซึ่งจะต้องอ้างอิงคีย์ในตารางนี้เป็นคีย์ต่างประเทศ คำถามของฉันคือวิธีใดที่มีประสิทธิภาพมากกว่าสำหรับความเร็วการค้นหา: 1) ฉันจะสร้างตารางใหม่รวมทั้งคอลัมน์ทั้ง 4 และอ้างอิงพวกเขาทั้งหมดในคีย์ต่างประเทศ หรือ 2) ฉันจะสร้างคอลัมน์ข้อมูลประจำตัวใหม่ในตารางคีย์หลักและใช้เป็นคีย์ต่างประเทศในตารางใหม่หรือไม่ ฐานข้อมูลนี้คาดว่าจะเก็บข้อมูลจำนวนมากดังนั้นฉันได้สร้างมันขึ้นมาจนถึงตอนนี้ด้วยมุมมองที่จะลดจำนวนข้อมูลที่เก็บไว้ในแต่ละตาราง ด้วยสิ่งนี้ในใจตัวเลือก 2 จะเป็นวิธีที่ดีที่สุดเนื่องจากฉันจะบันทึก 2 คอลัมน์และคอลัมน์วันที่สำหรับทุกแถว แต่ฉันต้องการหลีกเลี่ยงการเพิ่มเวลาการค้นหาหากไม่จำเป็น

1
สร้างคีย์หลักอัตโนมัติใน CREATE TABLE … AS SELECT
CREATE TABLE ... AS SELECT...ฉันสร้างตารางโดยใช้ความซับซ้อนแบบสอบถามเลือกผ่าน ฉันจะเพิ่มคีย์หลักการสร้างอัตโนมัติในแบบสอบถามนี้ได้อย่างไร ตัวอย่างเช่น: create table `user_mv` select `user`.`firstname` as `firstname`, `user`.`lastname` as `lastname`, `user`.`lang` as `lang`, `user`.`name` as `user_name`, `group`.`name` as `group_name` from `user` inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`) left join `group` on (`group`.`group_id`=`user_groups`.`group_id`) where `user`.`lang`=`group`.`lang` แบบสอบถามนี้จะสร้างตารางที่มีfirstname, lastname, lang, username, group_nameคอลัมน์ ฉันต้องการให้มีidคอลัมน์ที่เป็นคีย์หลักของการสร้างอัตโนมัติ มีวิธีใดในการทำเช่นนี้โดยเปลี่ยนคิวรีนี้ ฉันรู้ว่าฉันสามารถทำได้โดยการเปลี่ยนตารางหลังจากดำเนินการแบบสอบถามนี้ แต่ถ้ามีวิธีใดที่จะทำสิ่งนี้โดยตรงในcreate tableคำสั่งฉันต้องการทราบวิธีการทำเช่นนั้น

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

3
ตารางบันทึกควรได้รับช่อง id หรือคีย์หลักหรือไม่
ฉันมีตารางบันทึกที่รวบรวมการประทับวันที่และเวลาเมื่อไฟล์บางไฟล์ถูกส่งออกไปยังระบบอื่น ตาราง exportLog ปัจจุบันมีสามฟิลด์: id (primary key) messageId (int) exportedDateTime (datetime) จากการตรวจสอบนี้ฉันพบว่าidฟิลด์นี้ไม่มีจุดประสงค์เนื่องจากไม่มีการเชื่อมต่อกับตารางนี้ สิ่งเดียวที่ทำงานในตารางนี้คือการแทรกของชุดงานที่ประมวลผลข้อความและแทรกลงในตารางบันทึกนี้ ฉันควรลบidฟิลด์หรือไม่ ฉันควรจะมีคีย์หลักในการอย่างใดอย่างหนึ่งmessageIdหรือexportedDateTimeหรือทั้งสอง?

1
INDEX บนคีย์หลักคอมโพสิตเป็นอย่างไรใน mysql
เมื่อสร้างคีย์หลักผสมสำหรับคอลัมน์สองคอลัมน์ขึ้นไปเช่นPRIMARY KEY(col1, col2, col3); ระบบจะINDEXแต่ละคอลัมน์แยกกันไหม เหตุผลที่ฉันถามคำถามนี้คือเมื่อเราใช้UNIQUE INDEX (col1, col2, col3)มันจะทำหน้าที่เป็นINDEXคอลัมน์แรกเท่านั้นและเราจำเป็นต้องสร้างINDEXคอลัมน์เพิ่มเติมสำหรับคอลัมน์อื่น ๆ ฉันต้องการทราบว่าเป็นกรณีสำหรับคีย์หลักคอมโพสิตด้วยหรือไม่

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

4
คอลัมน์ NVARCHAR เป็นคีย์หลักหรือคอลัมน์ที่ไม่ซ้ำกัน
ฉันกำลังพัฒนาฐานข้อมูล SQL Server 2012 และฉันมีข้อสงสัยเกี่ยวกับคอลัมน์ nvarchar เป็นคีย์หลัก ฉันมีตารางนี้: CREATE TABLE [dbo].[CODES] ( [ID_CODE] [bigint] IDENTITY(1,1) NOT NULL, [CODE_LEVEL] [tinyint] NOT NULL, [CODE] [nvarchar](20) NOT NULL, [FLAG] [tinyint] NOT NULL, [IS_TRANSMITTED] [bit] NOT NULL DEFAULT 0, CONSTRAINT [PK_CODES] PRIMARY KEY CLUSTERED ( [CODE_LEVEL] ASC, [CODE] ASC ) ) แต่ตอนนี้ฉันต้องการใช้[CODE]คอลัมน์เป็นคีย์หลักและลบ[ID_CODE]คอลัมน์ มีปัญหาหรือบทลงโทษหรือไม่หากฉันมีNVARCHARคอลัมน์เป็นPRIMARY KEY? …


3
ฉันจะค้นหาตารางทั้งหมดในฐานข้อมูลที่ไม่มีคีย์หลักที่ชัดเจนได้อย่างไร
การค้นหาของ Google ได้กล่าวถึงจำนวนล้านครั้งของวิธีการค้นหาตารางที่ไม่มีการทำดัชนีแบบกลุ่มโดยปกติ PK จะเป็นดัชนีแบบกลุ่มของตาราง อย่างไรก็ตามตารางสามารถมีคีย์ธรรมชาติได้อย่างง่ายดายเป็นดัชนีคลัสเตอร์และดัชนีตัวแทนเสมือนที่ไม่ทำคลัสเตอร์เช่นคอลัมน์ข้อมูลประจำตัว ฉันจะค้นหาตารางทั้งหมดในฐานข้อมูลโดยไม่มีคีย์หลักได้อย่างไร ฉันมี 245 ตารางในฐานข้อมูลนี้: การตรวจสอบด้วยตนเองไม่มีประสิทธิภาพอย่างไม่มีการลด

4
การพิจารณาประสิทธิภาพระหว่างการใช้ PK แบบกว้างเทียบกับคีย์สังเคราะห์แบบแยกต่างหากกับ UQ คืออะไร
ฉันมีตารางหลายตารางที่สามารถระบุระเบียนได้โดยไม่ซ้ำกับสาขาธุรกิจที่หลากหลาย ก่อนหน้านี้ฉันใช้ฟิลด์เหล่านี้เป็น PK โดยคำนึงถึงประโยชน์เหล่านี้: เรียบง่าย; ไม่มีฟิลด์ที่ไม่เกี่ยวข้องและมีเพียงหนึ่งดัชนี การทำคลัสเตอร์ช่วยให้สามารถผสานการรวมอย่างรวดเร็วและตัวกรองตามช่วง อย่างไรก็ตามฉันได้ยินกรณีที่ทำเพื่อสร้างIDENTITY INTPK สังเคราะห์และบังคับใช้รหัสธุรกิจด้วยUNIQUEข้อ จำกัดแยกต่างหาก ข้อดีคือการที่ PK แคบทำให้ดัชนีรองมีขนาดเล็กกว่ามาก ถ้าตารางมีไม่มีดัชนีอื่น ๆ กว่า PK ผมไม่เห็นเหตุผลที่จะสนับสนุนแนวทางที่สองใด ๆ แม้ว่าจะอยู่ในตารางขนาดใหญ่ก็อาจดีที่สุดที่จะสรุปว่าดัชนีอาจมีความจำเป็นในอนาคตและดังนั้นจึงชอบ PK สังเคราะห์แคบ . ฉันขาดการพิจารณาใด ๆ หรือไม่? อนึ่งฉันไม่ได้โต้เถียงกับการใช้คีย์สังเคราะห์ในคลังข้อมูลฉันแค่สนใจว่าจะใช้ PK แบบกว้าง ๆ เพียงครั้งเดียวและเมื่อใดที่จะใช้ PK แบบแคบและอังกฤษแบบกว้าง

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