อะไรคือความแตกต่างที่แท้จริงระหว่างความสัมพันธ์แบบหนึ่งต่อกลุ่มและหลายต่อหนึ่ง มันกลับกันเท่านั้นชนิดของ?
ฉันไม่พบบทช่วยสอนที่ 'ดีและเข้าใจง่าย' เกี่ยวกับหัวข้อนี้นอกเหนือจากหัวข้อนี้: SQL for Beginners: ตอนที่ 3 - ความสัมพันธ์ของฐานข้อมูล
อะไรคือความแตกต่างที่แท้จริงระหว่างความสัมพันธ์แบบหนึ่งต่อกลุ่มและหลายต่อหนึ่ง มันกลับกันเท่านั้นชนิดของ?
ฉันไม่พบบทช่วยสอนที่ 'ดีและเข้าใจง่าย' เกี่ยวกับหัวข้อนี้นอกเหนือจากหัวข้อนี้: SQL for Beginners: ตอนที่ 3 - ความสัมพันธ์ของฐานข้อมูล
คำตอบ:
ใช่มันในทางกลับกัน ขึ้นอยู่กับว่าเอนทิตีนั้นมีความสัมพันธ์ด้านใด
ตัวอย่างเช่นหากแผนกหนึ่งสามารถจ้างพนักงานได้หลายคนแผนกกับพนักงานก็คือความสัมพันธ์แบบหนึ่งต่อหลายแผนก (แผนก 1 คนมีพนักงานหลายคน) ในขณะที่ความสัมพันธ์ระหว่างพนักงานกับแผนกเป็นแบบหลายต่อหนึ่ง (พนักงานหลายคนทำงานในแผนกเดียว)
ข้อมูลเพิ่มเติมเกี่ยวกับประเภทความสัมพันธ์:
จากหน้านี้เกี่ยวกับคำศัพท์ฐานข้อมูล
ความสัมพันธ์ระหว่างตารางส่วนใหญ่เป็นแบบหนึ่งต่อกลุ่ม
ตัวอย่าง:
- พื้นที่หนึ่งสามารถเป็นที่อยู่อาศัยของผู้อ่านจำนวนมาก
- ผู้อ่านหนึ่งคนสามารถสมัครรับข้อมูลได้หลายรายการ
- หนังสือพิมพ์หนึ่งฉบับสามารถสมัครสมาชิกได้หลายฉบับ
ความสัมพันธ์แบบกลุ่มต่อหนึ่งเหมือนกับกลุ่มหนึ่งต่อกลุ่ม แต่มาจากมุมมองที่แตกต่างกัน
- ผู้อ่านหลายคนอาศัยอยู่ในพื้นที่เดียว
- การสมัครสมาชิกจำนวนมากอาจเป็นของผู้อ่านคนเดียวและคนเดียวกัน
- การสมัครสมาชิกจำนวนมากมีไว้สำหรับหนังสือพิมพ์ฉบับเดียวและฉบับเดียวกัน
อะไรคือความแตกต่างที่แท้จริงระหว่างความสัมพันธ์แบบหนึ่งต่อกลุ่มและหลายต่อหนึ่ง
มีความแตกต่างทางแนวคิดระหว่างคำศัพท์เหล่านี้ที่จะช่วยให้คุณเห็นภาพข้อมูลและความแตกต่างที่เป็นไปได้ในสคีมาที่สร้างขึ้นซึ่งควรเข้าใจอย่างถ่องแท้ ความแตกต่างส่วนใหญ่เป็นมุมมองอย่างหนึ่ง
ในหนึ่งต่อหลายความสัมพันธ์ของตารางในท้องถิ่นมีหนึ่งแถวนั้นอาจจะเกี่ยวข้องกับหลายแถวในตารางอื่น ในตัวอย่างจากSQL สำหรับผู้เริ่มต้นหนึ่งCustomer
อาจจะเกี่ยวข้องกับหลายOrder
s
ในตรงข้ามหลายต่อหนึ่งความสัมพันธ์ของตารางในท้องถิ่นอาจมีหลายแถวที่เกี่ยวข้องกับหนึ่งแถวในตารางอื่น ในตัวอย่างของเราหลายOrder
s Customer
อาจจะเกี่ยวข้องกับหนึ่ง ความแตกต่างทางความคิดนี้มีความสำคัญต่อการแสดงจิต
นอกจากนี้สคีมาที่รองรับความสัมพันธ์อาจแสดงแตกต่างกันในตารางCustomer
และ Order
ตัวอย่างเช่นหากลูกค้ามีคอลัมน์id
และname
:
id,name
1,Bill Smith
2,Jim Kenshaw
จากนั้นสำหรับการOrder
เชื่อมโยงกับ a Customer
การใช้งาน SQL จำนวนมากจะเพิ่มOrder
คอลัมน์ที่เก็บข้อมูลid
ที่เกี่ยวข้องลงCustomer
ในตาราง (ในสคีมานี้customer_id
:
id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2
ในแถวข้อมูลด้านบนหากเราดูcustomer_id
คอลัมน์ id เราจะเห็นว่าBill Smith
(customer-id # 1) มีคำสั่งซื้อ 2 รายการที่เกี่ยวข้องกับเขาคำสั่งซื้อหนึ่งราคา 12.34 ดอลลาร์และอีกรายการหนึ่งในราคา 7.58 ดอลลาร์ Jim Kenshaw
(customer-id # 2) มีเพียง 1 คำสั่งซื้อในราคา $ 158.01
สิ่งสำคัญที่ต้องตระหนักก็คือโดยทั่วไปแล้วความสัมพันธ์แบบหนึ่งต่อกลุ่มจะไม่เพิ่มคอลัมน์ใด ๆ ลงในตารางที่เป็น "หนึ่ง" ไม่มีคอลัมน์พิเศษที่อธิบายความสัมพันธ์กับCustomer
Order
ในความเป็นจริงแล้วCustomer
อาจมีความสัมพันธ์แบบหนึ่งต่อกลุ่มShippingAddress
และSalesCall
ตารางและยังไม่มีคอลัมน์เพิ่มเติมในCustomer
ตาราง
อย่างไรก็ตามสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่มที่จะอธิบายมักจะมีการid
เพิ่มคอลัมน์ลงในตาราง "many" ซึ่งเป็นคีย์ต่างประเทศในตาราง "หนึ่ง" - ในกรณีนี้customer_id
จะมีการเพิ่มคอลัมน์ลงในOrder
. สำหรับคำสั่งซื้อที่เกี่ยวข้อง # 10 ในราคา $ 12.34 ถึงBill Smith
เรากำหนดcustomer_id
คอลัมน์ให้กับBill Smith
id 1
อย่างไรก็ตามเป็นไปได้เช่นกันที่จะมีตารางอื่นที่อธิบายถึงความสัมพันธ์Customer
และOrder
ความสัมพันธ์ดังนั้นจึงไม่จำเป็นต้องเพิ่มฟิลด์เพิ่มเติมในOrder
ตาราง แทนที่จะเพิ่มcustomer_id
เขตข้อมูลลงในOrder
ตารางอาจมีCustomer_Order
ตารางที่มีคีย์สำหรับทั้งCustomer
และOrder
.
customer_id,order_id
1,10
1,11
2,12
ในกรณีนี้แบบหนึ่งต่อกลุ่มและแบบกลุ่มต่อหนึ่งเป็นแนวคิดทั้งหมดเนื่องจากไม่มีการเปลี่ยนแปลงสคีมาระหว่างกัน กลไกใดขึ้นอยู่กับสคีมาและการใช้งาน SQL ของคุณ
หวังว่านี่จะช่วยได้
javax.persistence.OneToMany
แตกต่างจากManyToOne
. คุณบอกว่าตรงกันหรือแค่ขึ้นอยู่กับการนำไปใช้งาน? คำตอบของฉันไม่ถูกต้องหรือไม่?
ไม่มีความแตกต่างกัน มันเป็นเรื่องของภาษาและความชอบว่าคุณจะพูดถึงความสัมพันธ์แบบไหน
คำตอบสำหรับคำถามแรกของคุณคือทั้งคู่คล้ายกัน
คำตอบสำหรับคำถามที่สองของคุณคือ: แบบตัวต่อตัว -> ผู้ชาย (โต๊ะผู้ชาย) อาจมีภรรยามากกว่าหนึ่งคน (โต๊ะผู้หญิง) แบบหลายคนต่อหนึ่ง -> ผู้หญิงมากกว่าหนึ่งคนได้แต่งงานกับผู้ชายหนึ่งคน
ตอนนี้ถ้าคุณต้องการเชื่อมโยงความสัมพันธ์นี้กับสองตาราง MAN และ WOMEN หนึ่งแถวของตาราง MAN อาจมีความสัมพันธ์กับแถวต่างๆในตาราง WOMEN หวังว่ามันจะชัดเจน
สองตารางที่มีความสัมพันธ์เดียว
ใน SQL มีความสัมพันธ์เพียงชนิดเดียวเรียกว่าการอ้างอิง (ส่วนหน้าของคุณอาจทำสิ่งที่เป็นประโยชน์หรือสับสน [เช่นในคำตอบบางส่วน] แต่นั่นเป็นคนละเรื่อง)
ในแง่ SQL แถบอ้างอิง Foo
ไม่ใช่วิธีอื่น
CREATE TABLE Foo (
Foo CHAR(10) NOT NULL, -- primary key
Name CHAR(30) NOT NULL
CONSTRAINT PK -- constraint name
PRIMARY KEY (Foo) -- pk
)
CREATE TABLE Bar (
Bar CHAR(10) NOT NULL, -- primary key
Foo CHAR(10) NOT NULL, -- foreign key to Foo
Name CHAR(30) NOT NULL
CONSTRAINT PK -- constraint name
PRIMARY KEY (Bar), -- pk
CONSTRAINT Foo_HasMany_Bars -- constraint name
FOREIGN KEY (Foo) -- fk in (this) referencing table
REFERENCES Foo(Foo) -- pk in referenced table
)
เนื่องจากFoo.Foo
เป็นคีย์หลักจึงไม่ซ้ำกันมีเพียงแถวเดียวสำหรับค่าที่ระบุFoo
Bar.Foo
เป็นการอ้างอิงคีย์ต่างประเทศและไม่มีดัชนีที่ไม่ซ้ำกันจึงอาจมีหลายแถวสำหรับค่าที่กำหนดของFoo
Foo::Bar
จึงเป็นแบบหนึ่งต่อกลุ่ม Bar::Foo
คือแบบหลายต่อหนึ่ง
Bar
แถวใดแถวหนึ่งมีเพียงFoo
แถวเดียวที่อ้างอิงอะไรคือความแตกต่างที่แท้จริงระหว่างความสัมพันธ์แบบหนึ่งต่อกลุ่มและหลายต่อหนึ่ง
มีความสัมพันธ์เดียวจึงไม่มีความแตกต่างกัน การรับรู้ (จาก "จุดสิ้นสุด" หนึ่งหรือ "จุดสิ้นสุด" อื่น ๆ ) หรือการอ่านย้อนหลังจะไม่เปลี่ยนความสัมพันธ์
คาร์ดินาลิตี้ถูกประกาศก่อนในโมเดลข้อมูลซึ่งหมายถึงตรรกะและกายภาพ (เจตนา) จากนั้นในการนำไปใช้งาน (เจตนาที่รับรู้)
หนึ่งถึงศูนย์ต่อกลุ่ม
ใน SQL ที่ (ด้านบน) เป็นสิ่งที่จำเป็นทั้งหมด
หนึ่งต่อหนึ่งต่อหลาย
คุณต้องการไฟล์ธุรกรรมเพื่อบังคับใช้รายการในตารางอ้างอิง
หนึ่งถึงศูนย์ต่อหนึ่งที่
คุณต้องการในBar
:
CONSTRAINT AK -- constraint name
UNIQUE (Foo) -- unique column, which makes it an Alternate Key
หนึ่งต่อหนึ่ง
คุณต้องมีทำธุรกรรมเพื่อบังคับใช้ในตารางอ้างอิง
หลายต่อหลายคน
ไม่มีสิ่งเหล่านี้ในระดับกายภาพ (จำได้ว่ามีความสัมพันธ์เพียงประเภทเดียวใน SQL)
ในระดับลอจิกตอนต้นระหว่างแบบฝึกหัดการสร้างแบบจำลองจะสะดวกในการวาดความสัมพันธ์ดังกล่าว ก่อนที่โมเดลจะเข้าใกล้การนำไปใช้จริงควรยกระดับให้ใช้เฉพาะสิ่งที่มีอยู่ได้ดีกว่า ความสัมพันธ์ดังกล่าวได้รับการแก้ไขโดยการใช้ Associative Table
One-to-Many และ Many-to-One มีความคล้ายคลึงกันใน Multiplicity แต่ไม่ใช่ Aspect (เช่น Directionality)
การแม็ปความสัมพันธ์ระหว่างคลาสเอนทิตีและความสัมพันธ์ระหว่างตาราง ความสัมพันธ์มีสองประเภท:
ไม่มีความแตกต่างในทางปฏิบัติ เพียงแค่ใช้ความสัมพันธ์ที่เหมาะสมกับวิธีที่คุณเห็นปัญหาของคุณตามที่ Devendra แสดงไว้
--- หลายต่อหนึ่ง --- เด็กทั้ง 3 คนสามารถมีพ่อหรือแม่คนเดียวได้
ทั้งสองมีความคล้ายคลึงกัน สิ่งนี้สามารถใช้ได้ตามความต้องการ หากคุณต้องการหาลูกให้กับผู้ปกครองคนใดคนหนึ่งคุณสามารถเลือกแบบตัวต่อตัว ไม่เช่นนั้นหากต้องการหาพ่อแม่ลูกแฝดคุณอาจไปกับ Many-To-One ในทำนองเดียวกัน ....
one-to-manyมีคลาสพาเรนต์ที่มีจำนวนเด็ก n ดังนั้นจึงเป็นการแมปคอลเลคชัน
หลายต่อหนึ่งมีจำนวนลูกที่มีผู้ปกครองหนึ่งคนดังนั้นจึงเป็นการแมปวัตถุ