ฉันควรใช้สตริงบิต PostgreSQL หรือไม่


18

ฉันได้เรียนรู้เกี่ยวกับbit stringประเภทข้อมูลเมื่อเร็ว ๆ นี้และฉันค่อนข้างอยากรู้อยากเห็น:

  1. ที่ด้านล่างของหน้าเอกสารนี้มีประโยค:

    ... บวก 5 หรือ 8 ไบต์ค่าใช้จ่ายขึ้นอยู่กับความยาวของสตริง

  2. มีการจัดการสตริงบิตในภาษาอื่นเช่น PHP, Java, C #, C ++ และอื่น ๆ อย่างไรผ่านไดรเวอร์เช่น Npgsql, ODBC เป็นต้น

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

สำหรับ # 2 ฉันสับสนมากกว่าอยากรู้อยากเห็น ตัวอย่างเช่นถ้าฉันเก็บมาสก์บิตวันต่อสัปดาห์ไว้ในฟิลด์บิต (7) หนึ่งบิตต่อวันโดยมีบิตต่ำสุดแทนวันจันทร์ จากนั้นฉันจะค้นหาค่าใน PHP และ C ++ ฉันจะได้อะไร เอกสารประกอบบอกว่าฉันจะมีสตริงบิต แต่สตริงบิตไม่ใช่สิ่งที่ฉันสามารถใช้ได้โดยตรงเช่นเดียวกับจำนวนเต็ม จากนั้นในกรณีนี้ฉันควรจะยอมแพ้ในสนามบิต?

ทุกคนสามารถอธิบายได้ว่าทำไมและเมื่อใดที่ฉันควรใช้บิตหรือบิตที่แตกต่างกัน?



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

@ JackDouglas: ฉันจะไม่คัดลอกคำตอบของฉัน ฉันสงสัยว่า: การทำซ้ำคำตอบในเว็บไซต์ SE เป็นความคิดที่ดีหรือไม่
Erwin Brandstetter

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

@ JackDouglas: ก็สมเหตุสมผลแล้ว และฉันจะไม่เห็นด้วยหลังจากการสรรเสริญที่คุณเล็ดรอดได้อย่างไร? ;)
Erwin Brandstetter

คำตอบ:


18

หากคุณมีตัวแปรเพียงเล็กน้อยฉันจะพิจารณาเก็บbooleanคอลัมน์แยกต่างหาก

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

การเพิ่มประสิทธิภาพการจัดเก็บ

หากคุณมีตัวแปรเต็มรูปแบบมากกว่ามือ แต่น้อยกว่า 33 integerคอลัมน์อาจให้บริการคุณได้ดีที่สุด (หรือbigintตัวแปรสูงสุด 64 ตัว)

  • ตรง 4 ไบต์บนดิสก์
  • การจัดทำดัชนีที่รวดเร็วมากสำหรับการจับคู่ที่แน่นอน ( =ตัวดำเนินการ)
  • การจัดการค่าของแต่ละบุคคลอาจจะช้า / สะดวกน้อยกว่าด้วยหรือbit stringboolean

กับตัวแปรมากยิ่งขึ้นหรือถ้าคุณต้องการที่จะจัดการกับค่ามากหรือถ้าคุณไม่ได้มีโต๊ะขนาดใหญ่และพื้นที่ดิสก์ / RAM เป็นไม่มีปัญหาหรือถ้าคุณไม่แน่ใจว่าจะเลือกผมจะพิจารณาหรือbit(n)bit varying(n)

ตัวอย่าง

สำหรับข้อมูลเพียง3 บิตbooleanคอลัมน์แต่ละคอลัมน์จะได้รับด้วย 3 ไบต์integerความต้องการ 4 ไบต์และbit string6 ไบต์ (5 + 1)

สำหรับ32 บิตของข้อมูลที่มีintegerยังคงต้องการที่ 4 ไบต์ที่bit stringหมกมุ่นอยู่กับ 9 ไบต์สำหรับเดียวกัน (5 + 4) และbooleanคอลัมน์ครอบครอง 32 ไบต์

อ่านเพิ่มเติม


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

3

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

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

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

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

TL; ดร: ถ้าคุณต้องการคุณจะรู้ มิฉะนั้นยื่นมันออกไปในส่วน "สงวนไว้สำหรับใช้ในอนาคต" ในใจของคุณ

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