วิธีที่ดีที่สุดในการสร้างแบบจำลองเดี่ยวในฐานข้อมูลเชิงสัมพันธ์


12

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

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

ในอดีตที่ผ่านมาฉันได้ลองการออกแบบอื่น ๆ เช่นการอนุญาตให้มีหลายแถวในตารางหน้าแรกและการเลือกแบบสุ่ม ฉันได้ลองเพิ่มเขตข้อมูลบูลีนชื่อ "ใช้งานอยู่" และเลือกหนึ่งในหน้าแรกที่ใช้งานอยู่แบบสุ่ม ฉันพยายามบังคับให้แถวเดียวใช้งานได้ตลอดเวลาตามที่กำหนดในตรรกะของแอปพลิเคชัน ฉันไม่ได้พยายามสร้างตารางหน้าแรกและมีรายการอื่น ๆ เช่นบทความเพื่อให้มีฟิลด์บูลีนที่มีชื่อเช่น featured_on_homepage

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

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

นอกจากนี้ฉันมีปัญหาการสร้างแบบจำลองในกรณีอื่น ๆ นอกเหนือจากหน้าแรกเพียง มันเป็นเพียงตัวอย่างที่ง่ายที่สุดและใช้ได้โดยทั่วไปที่ฉันสามารถหาได้


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

คำตอบ:


10

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

HomePageProperty1 - UserValue1

HomePageProperty2 - UserValue2

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


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

2
+1 - รูปแบบตารางที่แน่นอนที่ Data Data ของเรามอบให้ฉันเพื่อจุดประสงค์เดียวกัน
Ali

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

3

ไม่ชัดเจนสำหรับฉันว่าคุณมีปัญหาที่คุณต้องแก้ไข

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

ฉันไม่แน่ใจว่าคุณกำลังพยายามแก้ปัญหาจริงเพื่อความซื่อสัตย์


2

สำหรับฉันแล้วดูเหมือนว่าคุณกำลังใช้ฐานข้อมูลสำหรับบางสิ่งที่ควรจัดเก็บเป็นไฟล์

คำอธิบายของคุณทำให้ฉันนึกถึงหน้า Wiki มากมายซึ่งผู้ใช้สามารถแก้ไขเนื้อหาได้ ใน Wikis หรืออย่างน้อยก็ในการติดตั้งใช้งานที่ฉันเคยเห็นหน้านี้ยังคงเป็นไฟล์อยู่

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

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


2

ไม่มีอะไรผิดปกติอย่างแน่นอนกับตารางที่มีหนึ่งแถว

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

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

ใช่ฉันไม่เพียง แต่บอกว่าตารางแถวเดียวก็โอเค แต่ฉันขอแนะนำให้คุณอาจต้องการมากกว่าหนึ่งตาราง


1

คุณสามารถสร้างตารางชื่อ STATIC_CONTENT และมีคอลัมน์สำหรับคีย์รวมถึงเนื้อหาตัวติดตามที่ใช้งาน / ไม่ได้ใช้งาน ฯลฯ จากนั้นสร้างแถวที่มีคีย์ "HomePage" และในหน้าแรกของคุณโหลดเนื้อหาสแตติกสำหรับคีย์นั้น และแสดงมัน ด้วยวิธีนี้เมื่อคุณมีเนื้อหาแบบคงที่อื่น ๆ (เกี่ยวกับหน้าหน้าผู้ติดต่อ ฯลฯ ) คุณสามารถเพิ่มแถวลงในตารางนั้นได้


1

ไม่มีอะไรผิดปกติในการมีโต๊ะที่มีเพียงแถวเดียว หากคุณมีเพียงอินสแตนซ์เดียวของเอนทิตีบางอย่างมันอาจเป็นวิธีที่ง่ายที่สุดในการเป็นตัวแทนของสิ่งนี้

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


0

เพียงเพื่อเพิ่มวอลเตอร์ ..

โครงสร้างตารางคุณสมบัติควรอนุญาตให้มีข้อมูลหลายชนิด

Fileds:
PropertyName
PropertyTextValue
PropertyDateValue
PropertyNumericValue
PropertyBoolValue

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

0

ดูเหมือนกับฉันว่าคุณจะสรุปได้อีกหนึ่งระดับ ในที่สุด "HomePage" คือ "หน้า" คุณสามารถมีหน้าชนิดต่าง ๆ พร้อมคุณสมบัติที่คุณต้องการ หากคุณมีส่วนต่างๆในไซต์ของคุณคุณอาจต้องใช้ "SectionHomePage" ซึ่งสามารถทำงานได้ดีเหมือนกับ "หน้าแรก"

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

ลองทำแบบนี้กัน ฉันกำลังเพิ่มตาราง ArticlePage เพื่อให้คุณเห็นว่าคุณสามารถแยกคุณสมบัติได้อย่างไร

PAGES
Id
Title
Description

HOMEPAGES
PageId (FK)
PhotoListLimit
ArticleListLimit
TextBlockListLimit

ARTICLEPAGE
PageId (FK)
ArticleMainQuote
ArticleMainBody
ArticlePhoto1
ArticlePhoto2

ที่จะทำงานได้ดีสำหรับฉันแม้จะทำงานได้ดีสำหรับไซต์ใหญ่

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