แนวปฏิบัติที่เหมาะสมที่สุดสำหรับการเลิกใช้คอลัมน์ฐานข้อมูลล้าสมัยคืออะไร [ปิด]


14

ฉันออกแบบแอปพลิเคชันซึ่งจะรวบรวมข้อมูล A, B และ C จากลูกค้าในระยะแรก แต่หลังจากนั้นจะรวบรวมข้อมูล A, B และ D แทน

A, B, C และ D ที่เกี่ยวข้องมากและในขณะนี้มีอยู่เป็นคอลัมน์ของฐานข้อมูลเดียว PostgreSQL ตารางT

เมื่อไม่ต้องการใช้ C อีกต่อไปฉันต้องการลบการอ้างอิงออกจากแอปพลิเคชันของฉัน (ฉันใช้Django ORM ) แต่ฉันต้องการเก็บข้อมูลที่ป้อนไว้แล้ว วิธีที่ดีที่สุดที่จะทำคืออะไร?

ฉันคิดว่าจะสร้างตารางใหม่สำหรับ ABD แต่นั่นหมายความว่าอาจทำให้เกิดปัญหากับตารางอ้างอิงแถวใดก็ได้ที

ฉันสามารถปล่อยให้คอลัมน์ C ไปพร้อมกันและลบการอ้างอิงถึงมันในโค้ดทำให้ข้อมูลที่มีอยู่รอด

มีตัวเลือกที่ดีกว่าที่ฉันไม่เห็นหรือไม่

รายละเอียดพิเศษบางอย่าง:

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


ฉันคิดว่าวิธีที่ถูกต้องในการเข้าถึงสิ่งนี้ขึ้นอยู่กับว่าคุณต้องการแยกแยะระหว่างแถวที่รวบรวมจาก {A, B, C} และแถวที่รวบรวมจาก {A, B, D} และถ้าใช่หากข้อมูลปัจจุบันของคุณ รูปแบบที่ช่วยให้นี้ และยังขึ้นอยู่กับสิ่งที่คุณจะทำกับแถวเหล่านั้นที่รวบรวมจาก {A, B, C} - เวอร์ชันใหม่ของแอปพลิเคชันแสดงให้พวกเขาเห็นว่าเป็น {A, B, D} ด้วย "D" ที่ว่างเปล่า แต่ ผู้ใช้ไม่เห็นเนื้อหาของคอลัมน์ C เขาอาจถูกล่อลวงให้ลบแถวนั้นออกจาก db (หากแอปอนุญาตให้ลบแถว) เนื่องจากเขาไม่เห็นเนื้อหา
Doc Brown


มีแถวที่มี C และ D รวมกันหรือไม่? หรือมันจะเป็น A, B, C, Null หรือ A, B, Null, D? หากคุณมี C, D อยู่ในแถวเดียวกันในช่วงเวลาสั้น ๆ ... อะไรคือเหตุผลที่ไม่มีตาราง A, B, C และ A, B, D? เรากำลังพูดถึง ... หลายร้อยแถวของข้อมูลหรือไม่ ล้าน? พันล้าน? เวลาตอบสนองเป็นปัจจัยหรือไม่ รายละเอียดมากมายที่ทำให้แต่ละสถานการณ์ไม่เหมือนใคร ...
WernerCD

@WernerCD เพิ่มรายละเอียดบางอย่างเกี่ยวกับเคสของฉันในคำถาม
Jad S

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

คำตอบ:


31

หากคุณต้องการเก็บข้อมูลแสดงว่ามันไม่ล้าสมัย เพียงแค่ปล่อยให้มันอยู่ตรงไหน ไม่เป็นไรถ้าคลาสที่แมปกับตารางไม่แมปทุกคอลัมน์


1
คุณอาจท้ายด้วยคอลัมน์ null จำนวนมากหลังจากนั้นสักครู่
Ewan

8
บางทีพวกเขาอาจขอวิธีปฏิบัติที่ดีที่สุดใน stackexchange .... เมื่อสิ่งนั้นเกิดขึ้น
Ewan

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

1
ฉันเห็นจุดของ @Ewan แต่สำหรับกรณีการใช้งานของฉันสิ่งนี้ควรทำ สิ่งต่าง ๆ อาจเกินความคาดหมายในหัวของฉัน แต่ควรจะค่อนข้างตรงไปตรงมาเพื่อเรียกใช้สคริปต์การโยกย้ายข้อมูลในภายหลังถ้าจำเป็นเกิดขึ้นเพื่อคัดลอกข้อมูล C ลงในตารางใหม่โดยอ้างอิงแถวต้นฉบับในตาราง T แล้วลบ คอลัมน์ C จากตาราง T
Jad S

3
@Ewan - สมมติว่าคอลัมน์ล้าสมัยจะไม่เกิดขึ้นเพียงครั้งเดียว - อาจเกิดขึ้นได้หลายครั้งเนื่องจากความต้องการการออกแบบถูกค้นพบหรือเปลี่ยนแปลง หากทางเลือกไปยังคอลัมน์ null คือการแยกไปยังตารางที่แยกต่างหาก (เช่นโครงสร้างการสืบทอด) เมื่อใดก็ตามที่คอลัมน์ล้าสมัยแล้วฐานข้อมูลจะถูกทิ้งร้างด้วยตารางเข้าร่วมสำหรับคอลัมน์ล้าสมัย ฉันเชื่อว่านี่น่าจะจบลงได้
โทมัส W

8

ตกลงดังนั้นสถานการณ์ของคุณคือคุณต้องการให้แถวเก่ามีคุณสมบัติ C แต่ไม่มีแถวใหม่

นี่เทียบเท่ากับการมีความสัมพันธ์ในการสืบทอดคลาส

class All
{
    string A;
    string B;
}

class Old : All
{
    string C;
}

class New : All
{
    string D;
}

ซึ่งคุณจะเป็นตัวแทนในฐานข้อมูลที่มีสามตารางที่มีความสัมพันธ์ 1 ถึง 1

table All
    id varchar
    A varchar
    B varchar

table Old
    id varchar
    C  varchar

table New
    id varchar
    D  varchar

ดังนั้นคุณสามารถสร้างสคริปต์การย้ายข้อมูลเพื่อสร้างตาราง Old ใหม่คัดลอกข้อมูล id และ C ไปยังมันและลบคอลัมน์ C ออกจากตาราง All

อัปเดตรหัสของคุณตามต้องการด้วย sql ใหม่

หรือหากคุณต้องการสืบค้นข้อมูล C เก่าคุณสามารถสร้างตารางเก็บถาวรใหม่ด้วย A, B, C คัดลอกข้อมูลทั้งหมดและลบคอลัมน์ C เพิ่มคอลัมน์ D ลงในตาราง 'สด' ของคุณ


1
ถ้าฉันแบ่งตารางฉันควรเลือกสามอย่าง: {A, B} {C} {D}
Aconcagua

ที่ไม่ตรงกับตัวอย่างหรือไม่
Ewan

รอ. ฉันพลาดอ่าน
Ewan

2

หากการจัดเก็บข้อมูลอาจเป็นปัญหาให้แบ่งตาราง: คีย์ / A / B คีย์ / C คีย์ / D

คุณสามารถทำการเข้าถึงได้ผ่านทางมุมมอง (คำจำกัดความของตำแหน่งข้อมูลในฐานข้อมูล) หรือผ่านการเปลี่ยนคำจำกัดความ ORM

นี่ไม่ใช่นักแสดงที่มีประสิทธิภาพมากที่สุด (มีส่วนร่วมในการเข้าร่วม) แต่มันสามารถนำเสนอการรวมกันของ A / B / C / D เมื่อเวลาผ่านไปโดยไม่ต้องเปลี่ยนที่เก็บข้อมูลพื้นฐาน & ขึ้นอยู่กับรูปแบบการเข้าถึงจริงของคุณ

คุณอาจไม่โชคดีที่มีความสามารถในการหยุดทำงานปรับโครงสร้างตาราง ฯลฯ ในระบบการผลิต

การเข้าถึงผ่านมุมมองช่วยให้คุณสามารถเปลี่ยนจาก A / B / C เป็น A / B / C / D เป็น A / B / D ในตารางต้นแบบที่มีการเปลี่ยนแปลงน้อยที่สุดและไม่มีการเคลื่อนไหวของข้อมูล มุมมองจะโปร่งใสกับตรรกะการอ่านและถ้า dbms ของคุณรองรับทั้งฟังก์ชั่นหรือมุมมองที่อัพเดตได้แล้วก็โปร่งใสกับตรรกะการเขียนเช่นกัน

ฉันคิดว่าการตัดสินใจของคุณจะสะท้อนข้อกังวลมากมายในโลกแห่งความเป็นจริง: 1) ประเภทข้อมูล C & D 2) ปริมาณข้อมูลสัมพัทธ์ที่รวบรวมไว้สำหรับ C / D 3) การทับซ้อนของ C / D เทียบกับรายการ C หรือ D ล้วนๆ 4) ความพร้อมใช้งานของหน้าต่างดาวน์ไทม์ / การบำรุงรักษาและระยะเวลา 5) การสนับสนุน DBMS สำหรับมุมมองที่อัปเดต 6) ความต้องการในการเก็บรายละเอียดโครงสร้างทางกายภาพของฐานข้อมูลใน ORM เทียบกับทำให้โปร่งใสโดยการนำเสนอผ่านมุมมอง / ฟังก์ชั่นในฐานข้อมูล แอปพลิเคชันไม่ใช่เฉพาะแอปพลิเคชันปัจจุบัน)

คำตอบของฉันเป็นที่ต้องการสำหรับประเภทข้อมูลขนาดใหญ่ / ซับซ้อนสำหรับ (1) ทับซ้อนเล็กน้อยสำหรับ (3) และหยุดทำงานน้อยที่สุดสำหรับ (4) โดยมีการสนับสนุน dbms ที่ดีใน (5) และแอปพลิเคชันหลายตัวที่เข้าถึงข้อมูลใน (6)

แต่ไม่มีทางที่ถูก / ผิดสำหรับทางเลือกมากมาย: - เริ่มต้นด้วย A / B / C, ต่อมาเพิ่ม D, ปรับ ORM, ยังคงวางคอลัมน์ C ในภายหลัง - เริ่มต้นด้วย A / B / C / D และละเว้น nulls เป็นต้น พิจารณาโซลูชันของคุณและสิ่งที่คุณรู้เกี่ยวกับวัตถุประสงค์ / วงจรชีวิตที่กำหนดไว้ทำแบบจำลองขนาด / ปริมาณและคาดว่าจะเปลี่ยนแปลงสิ่งต่าง ๆ ในภายหลัง


1

การลบการอ้างอิง & การย้ายข้อมูลเป็นตัวเลือกที่มีความเสี่ยงต่ำ

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

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

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


1

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

ฉันไม่รู้จัก Django ORM แต่อาจเป็นไปได้


2
OP บอกว่าพวกเขาใช้ Postgres
TripeHound

ขอบคุณ - ไม่เห็นแท็ก ฉันจะแก้ไข Q.
Robbie Dee

0
  • คุณมีตาราง A ที่มีคอลัมน์ a, b, c
  • สร้างตาราง B ใหม่พร้อมคอลัมน์ a, b, d
  • ย้ายข้อมูลของคุณไปที่ตาราง B
  • ย้ายกุญแจต่างประเทศของคุณไปที่ตาราง A ถึงตาราง B

ตอนนี้คุณสามารถใช้ตาราง B และคุณยังมีข้อมูลเก่าของคุณสำหรับการอ้างอิง

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