เคยใช้รายการในฐานข้อมูลเชิงสัมพันธ์หรือไม่?


94

ฉันพยายามออกแบบฐานข้อมูลเพื่อให้สอดคล้องกับแนวคิดโครงการและพบกับสิ่งที่ดูเหมือนว่าจะเป็นประเด็นถกเถียงกันอย่างถึงพริกถึงขิง ฉันได้อ่านบทความไม่กี่คำและ Stack Overflow บางคำตอบที่ระบุว่าไม่เคย (หรือเกือบจะไม่เคย) ตกลงในการจัดเก็บรายการ ID หรือสิ่งที่ชอบในฟิลด์ - ข้อมูลทั้งหมดควรมีความสัมพันธ์ ฯลฯ

อย่างไรก็ตามปัญหาที่ฉันพบคือฉันกำลังพยายามมอบหมายงาน ผู้คนจะสร้างงานมอบหมายให้คนหลายคนและมันจะบันทึกลงในฐานข้อมูล

แน่นอนถ้าฉันบันทึกงานเหล่านี้ทีละรายการใน "บุคคล" ฉันจะต้องมีคอลัมน์ "TaskID" หลอกตานับสิบ ๆ ตัวและจัดการแบบไมโครเพราะจะมีงานมอบหมายให้บุคคลหนึ่งถึง 0 ถึง 100

จากนั้นอีกครั้งถ้าฉันบันทึกงานในตาราง "งาน" ฉันจะต้องมีคอลัมน์ "PersonID" หลอกตานับสิบ ๆ ตัวและจัดการกับมันแบบไมโคร - ปัญหาเช่นเดียวกับเมื่อก่อน

สำหรับปัญหาเช่นนี้จะเป็นการดีไหมที่จะบันทึกรายการ ID ที่ใช้รูปแบบเดียวหรืออีกรูปแบบหนึ่งหรือฉันไม่คิดวิธีอื่นที่ทำได้โดยไม่ต้องทำลายหลักการ?


22
ผมทราบดีว่านี่คือการติดแท็ก "ฐานข้อมูลเชิงสัมพันธ์" ดังนั้นฉันจะปล่อยให้มันเป็นความคิดเห็นไม่ได้คำตอบ แต่ในประเภทอื่น ๆ ของฐานข้อมูลมันไม่ทำให้ความรู้สึกในการจัดเก็บรายการ คาสซานดราเข้ามาในใจเพราะมันไม่มีส่วนร่วม
Captain Man

12
ทำได้ดีในการค้นคว้าแล้วถามที่นี่! อันที่จริง 'คำแนะนำ' ที่ไม่เคยละเมิดรูปแบบปกติครั้งที่ 1 ทำได้ดีมากสำหรับคุณเพราะคุณควรหาวิธีอื่นที่เกี่ยวข้องซึ่งก็คือความสัมพันธ์แบบ "ต่อคน" ซึ่งมีรูปแบบมาตรฐานใน ฐานข้อมูลเชิงสัมพันธ์ที่ควรใช้
JimmyB

6
"มันไม่เป็นไร" ใช่ .... สิ่งต่อไปนี้คำตอบคือใช่ ตราบใดที่คุณมีเหตุผลที่ถูกต้อง มีกรณีการใช้งานเสมอที่บังคับให้คุณละเมิดแนวทางปฏิบัติที่ดีที่สุดเนื่องจากเหมาะสมที่จะทำเช่นนั้น (ในกรณีของคุณคุณไม่ควรแน่นอน)
xyious

3
ขณะนี้ฉันกำลังใช้อาร์เรย์ ( ไม่ใช่สตริงที่คั่นด้วย - กVARCHAR ARRAY) เพื่อจัดเก็บรายการแท็ก นั่นอาจไม่ใช่วิธีที่พวกเขาจะถูกจัดเก็บในภายหลังในบรรทัด แต่รายการจะมีประโยชน์อย่างมากในระหว่างขั้นตอนการสร้างต้นแบบเมื่อคุณไม่มีสิ่งอื่นที่จะชี้ไปที่และไม่ต้องการสร้างสคีมาฐานข้อมูลทั้งหมดก่อนที่คุณจะสามารถ ทำอย่างอื่น
Nic Hartley

3
@ Ben " (แม้ว่าพวกเขาจะไม่สามารถจัดทำดัชนี) " - ใน Postgres หลายสอบถามกับคอลัมน์ JSON (และอาจจะ XML แต่ผมยังไม่ได้ตรวจสอบ) มีความสามารถจัดทำดัชนี
Nic Hartley

คำตอบ:


249

คำสำคัญและแนวคิดสำคัญที่คุณต้องตรวจสอบเป็นฐานข้อมูลการฟื้นฟู

สิ่งที่คุณจะทำคือแทนที่จะเพิ่มข้อมูลเกี่ยวกับการกำหนดให้กับบุคคลหรือตารางงานคุณเพิ่มตารางใหม่ด้วยข้อมูลการมอบหมายนั้นพร้อมความสัมพันธ์ที่เกี่ยวข้อง

ตัวอย่างคุณมีตารางต่อไปนี้:

บุคคล:

+ ---- + ----------- +
| ID | ชื่อ |
+ + ==== =========== +
| 1 | อัลเฟรด
| 2 | Jebediah |
| 3 | ยาโคบ |
| 4 | เอเสเคียล
+ ---- + ----------- +

งาน:

+ ---- + -------------------- +
| ID | ชื่อ |
+ + ==== ==================== +
| 1 | เลี้ยงไก่
| 2 | ไถ
| 3 | รีดนมวัว
| 4 | ยกยุ้งฉาง
+ ---- + -------------------- +

จากนั้นคุณจะสร้างตารางที่สามด้วยการมอบหมาย ตารางนี้จะเป็นแบบจำลองความสัมพันธ์ระหว่างบุคคลและงาน:

+ ---- + ----------- + --------- +
| ID | PersonId | TaskId |
+ + ==== =========== + + =========
| 1 | 1 | 3 |
| 2 | 3 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 4 |
+ ---- + ----------- + --------- +

จากนั้นเราจะมีข้อ จำกัด Foreign Key เช่นว่าฐานข้อมูลจะบังคับให้ PersonId และ TaskIds ต้องเป็น ID ที่ถูกต้องสำหรับรายการต่างประเทศเหล่านั้น สำหรับแถวแรกเราจะเห็นPersonId is 1ดังนั้นอัลเฟรดได้รับมอบหมายให้TaskId 3, วัวรีดนม

สิ่งที่คุณควรเห็นที่นี่คือคุณมีงานมอบหมายน้อยหรือมากตามที่คุณต้องการ ในตัวอย่างนี้เอเสเคียลไม่ได้มอบหมายงานใด ๆ และอัลเฟรดได้รับมอบหมาย 2 หากคุณมีงานหนึ่งงานที่มี 100 คนการดำเนินการSELECT PersonId from Assignments WHERE TaskId=<whatever>;จะให้ผล 100 แถวพร้อมด้วยบุคคลที่แตกต่างหลากหลายที่ได้รับมอบหมาย คุณสามารถWHEREบน PersonId เพื่อค้นหางานทั้งหมดที่มอบหมายให้กับบุคคลนั้น

หากคุณต้องการส่งคืนเคียวรีที่แทนที่ Id ด้วยชื่อและภารกิจคุณจะได้เรียนรู้วิธีเข้าร่วมตาราง


86
คำหลักที่คุณต้องการค้นหาเพื่อเรียนรู้เพิ่มเติมคือ " ความสัมพันธ์แบบหลายต่อหลายคน "
BlueRaja - Danny Pflughoeft

34
เพื่ออธิบายรายละเอียดเล็กน้อยเกี่ยวกับความคิดเห็นของ Thierrys: คุณอาจคิดว่าคุณไม่จำเป็นต้องทำให้เป็นมาตรฐานเพราะฉันต้องการเพียง X และมันง่ายมากในการจัดเก็บรายการ IDแต่สำหรับระบบใด ๆ ที่อาจขยายในภายหลังคุณจะเสียใจที่ไม่ทำให้มาตรฐาน ก่อน ปกติเสมอ ; คำถามเดียวก็คือรูปแบบปกติ
ม.ค. Doggen

8
เห็นด้วยกับ @Jan - กับการตัดสินที่ดีกว่าของฉันฉันอนุญาตให้ทีมของฉันใช้ทางลัดในการออกแบบกลับมาอีกครั้งโดยจัดเก็บ JSON แทนสิ่งที่ "ไม่จำเป็นต้องขยาย" นั่นกินเวลาประมาณหกเดือน FML ผู้อัปเกรดของเรามีการต่อสู้ที่น่ารังเกียจในมือเพื่อโยกย้าย JSON ไปยังรูปแบบที่เราควรเริ่มต้นด้วย ฉันควรจะรู้จักกันดีกว่า
การแข่งขัน Lightness ใน Orbit

13
@Dupuplicator: เป็นเพียงการแสดงคอลัมน์หลักที่สำคัญจำนวนเต็มเพิ่มขึ้นโดยอัตโนมัติ สิ่งทั่วไปสวย
whatsisname

8
@whatsisname บนตารางบุคคลหรือภารกิจฉันเห็นด้วยกับคุณ บนตารางบริดจ์ที่มีจุดประสงค์เพียงอย่างเดียวคือการแสดงความสัมพันธ์แบบหลายต่อกลุ่มระหว่างสองตารางอื่น ๆ ที่มีคีย์ตัวแทนอยู่แล้ว ฉันจะไม่เพิ่มโดยไม่มีเหตุผลที่ดี เป็นค่าใช้จ่ายเพียงอย่างเดียวเนื่องจากจะไม่มีการใช้ในการสอบถามหรือความสัมพันธ์
jpmc26

35

คุณถามคำถามสองข้อที่นี่

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

น่าเสียดายที่คำถามที่สองของคุณอธิบายสถานการณ์ที่คุณควรเลือกวิธีการเชิงสัมพันธ์ที่มากขึ้น คุณจะต้อง 3 ตาราง หนึ่งรายการสำหรับบุคคลหนึ่งรายการสำหรับภารกิจและอีกหนึ่งรายการที่เก็บรักษารายการที่มอบหมายให้บุคคลใด อันสุดท้ายจะเป็นแนวตั้งหนึ่งแถวต่อคน / รวมกันของงานโดยมีคอลัมน์สำหรับคีย์หลักของคุณ id ของงานและรหัสบุคคล


9
ตัวอย่างส่วนผสมที่คุณอ้างอิงนั้นถูกต้องบนพื้นผิว แต่มันจะเป็นธรรมดาในกรณีนั้น มันไม่ใช่รายการในแง่ของการเขียนโปรแกรม (เว้นแต่คุณจะหมายความว่าสตริงนั้นเป็นรายการของตัวอักษรที่คุณไม่ต้องการ) OP อธิบายข้อมูลว่า "รายการรหัส" (หรือแม้แต่ "รายการ [.. ]") แสดงถึงว่าพวกเขาอยู่ในจุดที่จัดการข้อมูลนี้เป็นวัตถุแต่ละรายการ
Flater

10
@ Flater: แต่มันเป็นรายการ คุณต้องสามารถจัดรูปแบบใหม่เป็นรายการ HTML รายการ Markdown รายการ JSON และอื่น ๆ เพื่อให้แน่ใจว่ารายการจะแสดงอย่างถูกต้องในหน้าเว็บเอกสารข้อความแบบธรรมดาโทรศัพท์มือถือ แอพ ... และคุณไม่สามารถทำได้ด้วยข้อความธรรมดา
เควิน

12
@Kevin ถ้านั่นคือเป้าหมายของคุณมันจะสำเร็จได้ง่ายขึ้นและง่ายขึ้นโดยการจัดเก็บส่วนผสมในตาราง! ไม่ต้องพูดถึงถ้าต่อมาผู้คนจะ ... โอ้ฉันไม่รู้พูดขอคำแนะนำแทนหรือสิ่งที่โง่เหมือนหาสูตรทั้งหมดโดยไม่มีถั่วลิสงหรือกลูเตนหรือโปรตีนจากสัตว์ ...
แดน Bron

10
@DanBron: YAGNI ตอนนี้เราแค่ใช้รายการเพราะมันทำให้ตรรกะ UI ง่ายขึ้น ถ้าเราต้องการหรือจะต้องพฤติกรรมรายการเหมือนในชั้นตรรกะทางธุรกิจแล้วมันควรจะเป็นปกติในตารางที่แยกต่างหาก ตารางและตัวเชื่อมไม่จำเป็นต้องมีราคาแพง แต่มันไม่ฟรีและพวกเขานำคำถามเกี่ยวกับการสั่งองค์ประกอบ ("เราสนใจเกี่ยวกับลำดับของส่วนผสมหรือไม่") และการทำให้เป็นมาตรฐานต่อไป ("คุณจะเปลี่ยน '3 ฟอง') เป็น ('egg', 3)? แล้วเกลือ 'เพื่อลิ้มรส' คืออะไร ('เกลือ', NULL)? ")
เควิน

7
@Kevin: YAGNI ค่อนข้างผิดที่นี่ ตัวคุณเป็นที่ถกเถียงกันถึงความจำเป็นของความสามารถในการเปลี่ยนรายการในหลาย ๆ (HTML, markdown, JSON) และทำให้มีการโต้เถียงที่คุณต้องการแต่ละองค์ประกอบของรายการ เว้นแต่ว่าที่เก็บข้อมูลและแอพพลิเคชั่น "การจัดการรายการ" นั้นเป็นสองแอพพลิเคชั่นที่ได้รับการพัฒนาอย่างอิสระ (และโปรดทราบว่าแอปพลิเคชันเลเยอร์ที่แยกต่างหาก! = แอพพลิเคชั่นแยก) โครงสร้างฐานข้อมูล - ในขณะที่หลีกเลี่ยงตรรกะการแยก / การแปลงเพิ่มเติม
Flater

22

สิ่งที่คุณอธิบายเป็นที่รู้จักกันว่าเป็น "หลายหลาย" ความสัมพันธ์ในกรณีของคุณระหว่างและPerson Taskโดยทั่วไปจะใช้งานโดยใช้ตารางที่สามซึ่งบางครั้งเรียกว่าตาราง "ลิงก์" หรือ "การอ้างอิงโยง" ตัวอย่างเช่น:

create table person (
    person_id integer primary key,
    ...
);

create table task (
    task_id integer primary key,
    ...
);

create table person_task_xref (
    person_id integer not null,
    task_id integer not null,
    primary key (person_id, task_id),
    foreign key (person_id) references person (person_id),
    foreign key (task_id) references task (task_id)
);

2
คุณอาจต้องการเพิ่มดัชนีด้วยtask_idอันดับแรกหากคุณอาจทำแบบสอบถามที่กรองตามงาน
jpmc26

1
ยังรู้ว่าเป็นตารางสะพาน นอกจากนี้ฉันหวังว่าฉันจะให้คุณเป็นพิเศษกับการไม่มีคอลัมน์ข้อมูลประจำตัวแม้ว่าฉันจะแนะนำดัชนีในแต่ละคอลัมน์
jmoreno

13

... ไม่เป็นไร (หรือแทบจะไม่เคย) ตกลงที่จะเก็บรายการ ID หรือสิ่งที่ชอบในฟิลด์

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

เนื่องจาก "รายการ" คือตามคำนิยามประกอบด้วยองค์ประกอบขนาดเล็ก (รายการ) นี่ไม่ใช่กรณีที่นี่และคุณควรทำให้ข้อมูลเป็นมาตรฐาน

... ถ้าฉันบันทึกงานเหล่านี้ทีละรายการใน "บุคคล" ฉันจะต้องมีคอลัมน์ "TaskID" หลอกตานับสิบ ...

ไม่คุณจะมีแถวสองสามแถวใน Intersection Table (aka Weak Entity) ระหว่างบุคคลและภารกิจ ฐานข้อมูลทำงานได้ดีกับแถวจำนวนมาก จริงๆแล้วพวกเขาค่อนข้างขยะที่ทำงานกับคอลัมน์ [ซ้ำ] จำนวนมาก

ตัวอย่างชัดเจนดีที่กำหนดโดย whatsisname


4
เมื่อสร้างระบบชีวิตจริง "ไม่เคยพูดไม่เคย" เป็นกฎที่ดีมากในการใช้ชีวิต
l0b0

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

4

มันอาจถูกต้องตามกฎหมายในบางฟิลด์ที่คำนวณล่วงหน้า

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

ตัวอย่างเช่นใน UI ที่คุณต้องการแสดงรายการนี้โดยใช้มุมมองกริดซึ่งแต่ละแถวสามารถเปิดรายละเอียดทั้งหมด (พร้อมรายการทั้งหมด) หลังจากดับเบิลคลิก:

REGISTERED USER LIST
+------------------+----------------------------------------------------+
|Name              |Top 3 most visited tags                             |
+==================+====================================================+
|Peter             |Design, Fitness, Gifts                              |
+------------------+----------------------------------------------------+
|Lucy              |Fashion, Gifts, Lifestyle                           |
+------------------+----------------------------------------------------+

คุณกำลังทำให้คอลัมน์ที่สองอัปเดตโดยทริกเกอร์เมื่อลูกค้าเยี่ยมชมบทความใหม่หรือตามงานที่กำหนด

คุณสามารถทำให้ฟิลด์นั้นพร้อมใช้งานได้แม้จะค้นหา (เป็นข้อความปกติ)

สำหรับกรณีดังกล่าวการเก็บรักษารายการนั้นถูกต้องตามกฎหมาย คุณเพียงแค่ต้องคำนึงถึงตัวพิมพ์ใหญ่กว่าความยาวฟิลด์สูงสุด


นอกจากนี้หากคุณใช้ Microsoft Access เขตข้อมูลที่มีหลายค่าเป็นกรณีการใช้งานพิเศษอีกกรณีหนึ่ง พวกเขาจัดการรายการของคุณในเขตข้อมูลโดยอัตโนมัติ

แต่คุณสามารถถอยกลับไปใช้แบบฟอร์มมาตรฐานปกติที่แสดงในคำตอบอื่น


สรุป: รูปแบบปกติของฐานข้อมูลเป็นแบบจำลองทางทฤษฎีที่จำเป็นสำหรับการทำความเข้าใจกับแง่มุมที่สำคัญของการสร้างแบบจำลองข้อมูล แต่แน่นอนว่าการทำให้เป็นมาตรฐานนั้นไม่ได้คำนึงถึงประสิทธิภาพของบัญชีหรือค่าใช้จ่ายอื่นในการดึงข้อมูล มันอยู่นอกขอบเขตของโมเดลเชิงทฤษฎีนั้น แต่การจัดเก็บรายการหรือรายการที่คำนวณล่วงหน้า (และควบคุม) ซ้ำซ้อนอื่น ๆ นั้นเป็นสิ่งจำเป็นสำหรับการใช้งานจริง

ในแง่ของข้างต้นในการใช้งานจริงเราจะต้องการให้เคียวรีอาศัยรูปแบบปกติที่สมบูรณ์แบบและใช้งาน 20 วินาทีหรือเคียวรีที่เทียบเท่าโดยอาศัยค่าที่คำนวณล่วงหน้าซึ่งใช้เวลา 0.08 วินาทีหรือไม่ ไม่มีใครชอบผลิตภัณฑ์ซอฟต์แวร์ที่ถูกกล่าวหาว่าเชื่องช้า


1
มันอาจถูกต้องตามกฎหมายแม้จะไม่มีสิ่งที่คำนวณล่วงหน้า ฉันได้ทำไปแล้วสองสามครั้งที่ข้อมูลถูกจัดเก็บอย่างเหมาะสม แต่ด้วยเหตุผลด้านประสิทธิภาพมันมีประโยชน์ที่จะเก็บผลการแคชไว้ในบันทึกหลัก
Loren Pechtel

@ LorenPechtel - ใช่ขอบคุณในการใช้คำที่คำนวณล่วงหน้าของฉันฉันยังรวมถึงกรณีของค่าแคชที่เก็บไว้ในกรณีที่จำเป็น ในระบบที่มีการพึ่งพาที่ซับซ้อนจะเป็นวิธีการรักษาประสิทธิภาพให้เป็นปกติ และหากโปรแกรมมีความรู้เพียงพอค่าเหล่านี้จะเชื่อถือได้และซิงค์อยู่เสมอ ฉันไม่ต้องการเพิ่มกรณีของการแคชลงในคำตอบเพื่อให้คำตอบนั้นง่ายและปลอดภัย มันได้ลงคะแนนแล้ว :)
miroxlav

@ LorenPechtel ที่จริงแล้วยังคงเป็นเหตุผลที่ไม่ดี ... ข้อมูลแคชควรถูกเก็บไว้ในที่เก็บแคชระดับกลางและในขณะที่แคชยังคงถูกต้องแบบสอบถามนั้นไม่ควรกดฐานข้อมูลหลัก
Tezra

1
@Tezra ไม่ฉันกำลังบอกว่าบางครั้งข้อมูลจากตารางรองจำเป็นต้องใช้บ่อยพอที่จะทำให้การคัดลอกลงในระเบียนหลัก (ตัวอย่างที่ฉันทำไปแล้ว - ตารางพนักงานรวมถึงเวลาเข้าและออกครั้งสุดท้ายพวกเขาจะใช้เพื่อการแสดงผลเท่านั้นการคำนวณใด ๆ ที่เกิดขึ้นจริงนั้นมาจากตารางที่มีบันทึกการเข้า / ออกนาฬิกา)
Loren Pechtel

0

รับสองตาราง; เราจะเรียกพวกเขาว่า Person and Task โดยแต่ละอันจะมี ID ของตัวเอง (PersonID, TaskID) ... แนวคิดพื้นฐานคือการสร้างตารางที่สามเพื่อผูกเข้าด้วยกัน เราจะเรียกตารางนี้ว่า PersonToTask อย่างน้อยที่สุดมันควรมี ID ของตัวเองเช่นเดียวกับอีกสองคนดังนั้นเมื่อมันมาถึงการมอบหมายงานให้ใครบางคน คุณจะไม่จำเป็นต้องอัปเดตตารางบุคคลอีกต่อไปคุณเพียงแค่แทรกบรรทัดใหม่ใน PersonToTaskTable และการบำรุงรักษาง่ายขึ้น - ต้องลบงานเพียงแค่ลบตาม TaskID ไม่ต้องอัปเดตตารางบุคคลและเชื่อมโยงกับการแยกวิเคราะห์

CREATE TABLE dbo.PersonToTask (
    pttID INT IDENTITY(1,1) NOT NULL,
    PersonID INT NULL,
    TaskID   INT NULL
)

CREATE PROCEDURE dbo.Task_Assigned (@PersonID INT, @TaskID INT)
AS
BEGIN
    INSERT PersonToTask (PersonID, TaskID)
    VALUES (@PersonID, @TaskID)
END

CREATE PROCEDURE dbo.Task_Deleted (@TaskID INT)
AS
BEGIN
    DELETE PersonToTask  WHERE TaskID = @TaskID
    DELETE Task          WHERE TaskID = @TaskID
END

วิธีการเกี่ยวกับรายงานอย่างง่ายหรือผู้ที่ได้รับมอบหมายให้ทำงาน

CREATE PROCEDURE dbo.Task_CurrentAssigned (@TaskID INT)
AS
BEGIN
    SELECT PersonName
    FROM   dbo.Person
    WHERE  PersonID IN (SELECT PersonID FROM dbo.PersonToTask WHERE TaskID = @TaskID)
END

แน่นอนว่าคุณสามารถทำอะไรได้อีกมากมาย TimeReport สามารถทำได้ถ้าคุณเพิ่มเขตข้อมูล DateTime สำหรับ TaskAssigned และ TaskCompleted ทุกอย่างขึ้นอยู่กับคุณ


0

มันอาจทำงานได้ถ้าพูดว่าคุณมีคีย์หลักที่มนุษย์สามารถอ่านได้และต้องการรายการของ # task โดยไม่ต้องจัดการกับธรรมชาติในแนวตั้งของโครงสร้างตาราง เช่นการอ่านตารางแรกง่ายกว่ามาก

------------------------  
Employee Name | Task 
Jack          |  1,2,5
Jill          |  4,6,7
------------------------

------------------------  
Employee Name | Task 
Jack          |  1
Jack          |  2
Jack          |  5
Jill          |  4
Jill          |  6
Jill          |  7
------------------------

คำถามก็คือ: หากรายการงานถูกจัดเก็บหรือสร้างตามความต้องการซึ่งส่วนใหญ่จะขึ้นอยู่กับข้อกำหนดเช่นความถี่ที่ต้องการรายการความถูกต้องของจำนวนแถวข้อมูลวิธีการใช้ข้อมูลเป็นต้น .. หลังจากนั้นวิเคราะห์การแลกเปลี่ยนประสบการณ์ผู้ใช้และความต้องการการประชุมที่ควรทำ

ตัวอย่างเช่นการเปรียบเทียบเวลาที่ใช้ในการเรียกคืน 2 แถวเทียบกับการเรียกใช้แบบสอบถามที่จะสร้าง 2 แถว หากใช้เวลานานและผู้ใช้ไม่ต้องการรายการที่เป็นปัจจุบันมากที่สุด (* คาดว่าจะมีการเปลี่ยนแปลงน้อยกว่า 1 รายการต่อวัน) ก็สามารถจัดเก็บได้

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


ตามที่คุณพูดทุกอย่างขึ้นอยู่กับวิธีการดึงข้อมูล หากคุณ / เฉพาะ / เคยสืบค้นตารางนี้ด้วยชื่อผู้ใช้ฟิลด์ "รายการ" ก็เพียงพอแล้ว อย่างไรก็ตามคุณสามารถสอบถามตารางดังกล่าวเพื่อค้นหาว่าใครกำลังทำงานใน Task # 1234567 และยังคงทำงานอยู่ได้ ฟังก์ชั่นสตริง "find-X- ทุกที่ในฟิลด์" เกือบทุกชนิดจะทำให้แบบสอบถามดังกล่าวไปยัง / Table Scan / ทำให้สิ่งต่าง ๆ ช้าลงในการรวบรวมข้อมูล ด้วยข้อมูลที่ได้รับการปรับมาตรฐานและจัดทำดัชนีอย่างเหมาะสมซึ่งจะไม่เกิดขึ้น
Phill W.

0

คุณกำลังทำอะไรควรอยู่ในตารางอื่นหมุนมันผ่าน 90 องศาแล้วเปลี่ยนเป็นอีกโต๊ะ

มันเหมือนกับการมีตารางการสั่งซื้อที่คุณมี itemProdcode1, itemQuantity1, itemPrice1 ... itemProdcode37, itemQuantity37, itemPrice37 นอกเหนือจากความงุ่มง่ามในการจัดการโดยทางโปรแกรมคุณสามารถรับประกันได้ว่าพรุ่งนี้ใครบางคนจะต้องการสั่งซื้อ 38 สิ่ง

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

ดังนั้นคำสั่งซื้อคือรายการ Bill of Materials จึงเป็นรายการ (หรือรายการของรายการซึ่งจะเป็นฝันร้ายที่จะนำ "ไซด์เวย์" ไปใช้) แต่โน้ต / ความคิดเห็นและบทกวีไม่ใช่


0

ถ้ามันเป็น "ไม่ตกลง" มันก็ค่อนข้างเลวร้ายที่ทุกเว็บไซต์ Wordpress เคยมีรายการใน wp_usermeta ที่มี wp_capabilities ในแถวเดียว, ไล่รายการลิสต์ในแถวหนึ่งและอื่น ๆ ...

ในความเป็นจริงในกรณีเช่นนี้มันอาจจะดีกว่าสำหรับความเร็วในขณะที่คุณมักจะจะต้องการรายการ แต่ Wordpress ไม่เป็นตัวอย่างที่สมบูรณ์แบบของการปฏิบัติที่ดีที่สุด

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