มีเหตุผลที่ดีในการรักษาวันที่และเวลาในคอลัมน์แยกกันหรือไม่?


9

ฉันพยายามเข้าใจการตัดสินใจของผู้จำหน่ายซอฟต์แวร์ของเราเพื่อเก็บวันที่และเวลาในคอลัมน์แยกกัน ตัวอย่างเช่นเมื่อแถวถูกสร้างหรือปรับปรุง ทั้งเวลาและวันที่เป็นคอลัมน์ DateTime เรากำลังใช้ SQL Server 2005

ฐานข้อมูลเก็บข้อมูลระบบ ERP ของเราและฉันเชื่อว่าตารางที่ใหญ่ที่สุดมีประมาณ ~ 3 ล้านแถว ตารางส่วนใหญ่อยู่ระหว่างประมาณ 100,000 ถึง 1 000 000 แถว

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

การแยกวันและเวลานั้นเป็นการฝึกฝนที่ไม่ดีหรือมีบางสิ่งที่ยอดเยี่ยมมากในการออกแบบนี้ที่ฉันไม่เข้าใจ

คำตอบ:


4

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

ที่กล่าวว่าไม่มีอะไรที่ยอดเยี่ยมเกี่ยวกับการแยกวันที่และเวลาดังนั้นจึงไม่มีอะไรที่คุณขาดหายไป

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


4

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

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


3

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

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


0

หากต้องการเพิ่มความคิดเห็นของ ConcernedOfTunbridgeWe จะมีข้อได้เปรียบด้านประสิทธิภาพการสืบค้นหากคุณมีตาราง DateDimension และ TimeDimension พิจารณาตารางข้อเท็จจริงมีทั้ง dateDimensionKey และ TimeDimensionKey หากคุณต้องการค้นหาจำนวนของบางสิ่งบางอย่างระหว่าง 8.00 น. ถึง 17.00 น. คุณสามารถทำได้

SELECT COUNT(1) FROM FactTable f Inner Join TimeDimension t on f.TimeDimensionKey = t.TimeDimension WHERE t.Hour BETWEEN 8 AND 17.

หากคุณมีการเพิ่มดัชนีลงใน TimeDimensionKey คุณจะต้องใช้ดัชนีค้นหาเพื่อดูผลลัพธ์ในตารางข้อเท็จจริงเพื่อค้นหาข้อมูล

หากไม่มีตาราง TimeDimension คุณจะต้องทำสิ่งต่อไปนี้

SELECT COUNT(1) FROM FactTable f WHERE DatePart(mintue, f.Date) BETWEEN 8 AND 17

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

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