คำถามติดแท็ก database-design

การพัฒนาสกีมาแนวคิดและ / หรือโมเดลเชิงตรรกะและ / หรือการตั้งค่าทางกายภาพของฐานข้อมูล

1
JSONB พร้อมการจัดทำดัชนี vs. hstore
ฉันกำลังพยายามตัดสินใจเกี่ยวกับการออกแบบฐานข้อมูลโดยมีข้อสมมติฐานน้อยที่สุด (เกี่ยวกับวิธีที่แอพพลิเคชั่นบนเว็บพัฒนาขึ้น) ในขั้นตอนนี้ เป็นขั้นตอนแรกการทำความเข้าใจว่าการเข้าร่วมนั้นมีราคาแพงฉันกำลังพิจารณาตารางเสาหินจำนวนน้อยเมื่อเทียบกับตารางขนาดเล็กจำนวนมากปกติ เป็นจุดที่สองฉันสับสนระหว่างการใช้ hstore กับตารางปกติเทียบกับ JSONB (ด้วยการทำดัชนี GiST) AFAIK (โปรดแก้ไขให้ถูกต้อง): โดยทั่วไปใน Postgres hstore จะทำงานได้ดีกว่าประเภทข้อมูลอื่น งานนำเสนอจาก FOSDEM PGDAY มีสถิติที่น่าสนใจ (ในช่วงครึ่งหลังของสไลด์) https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf ข้อได้เปรียบของ hstore คือการสร้างดัชนีอย่างรวดเร็ว (GiN หรือ GiST) อย่างไรก็ตามด้วยการทำดัชนี JSONB, GiN และ GiST สามารถนำไปใช้กับข้อมูล JSON ได้ บล็อกนี้จากมืออาชีพที่ 2 Quadrant กล่าวว่า "ณ จุดนี้อาจคุ้มค่าที่จะแทนที่การใช้ hstore ด้วย jsonb ในแอปพลิเคชันใหม่ทั้งหมด" (เลื่อนไปยังจุดสิ้นสุด): http://blog.2ndquadrant.com/postgresql-anti-patterns-unn Essential -jsonhstore …

4
Do SSD ช่วยลดประโยชน์ของฐานข้อมูล
ฉันเพิ่งได้ยินเกี่ยวกับ Robert Martin วันนี้และดูเหมือนว่าเขาเป็นบุคคลสำคัญในโลกซอฟต์แวร์ดังนั้นฉันไม่ได้ตั้งใจให้ชื่อของฉันปรากฏราวกับว่ามันเป็นเหยื่อคลิกหรือฉันใส่คำเข้าไปในปากของเขา ฉันตีความสิ่งที่ฉันได้ยินจากเขาด้วยประสบการณ์และความเข้าใจที่ จำกัด ของฉันได้อย่างไร ฉันกำลังดูวิดีโอวันนี้ (ในสถาปัตยกรรมซอฟต์แวร์) จากการพูดคุยของ Robert C. Martin และในช่วงครึ่งหลังของวิดีโอหัวข้อของฐานข้อมูลเป็นจุดสนใจหลัก จากความเข้าใจในสิ่งที่เขาพูดดูเหมือนว่าเขาจะบอกว่า SSD นั้นจะลดประโยชน์ของฐานข้อมูล ( อย่างมาก ) เพื่ออธิบายวิธีที่ฉันมาถึงการตีความนี้: เขากล่าวถึงวิธีที่มี HDDs / ดิสก์หมุนการดึงข้อมูลช้า อย่างไรก็ตามทุกวันนี้เราใช้ SSD เขาตั้งข้อสังเกต เขาเริ่มต้นด้วย "RAM กำลังมา" จากนั้นดำเนินการต่อโดยการกล่าวถึงดิสก์ RAM แต่แล้วก็บอกว่าเขาไม่สามารถเรียกมันว่าดิสก์ RAM ได้ดังนั้นจึงต้องบอกว่า RAM ดังนั้นสำหรับ RAM เราไม่ต้องการดัชนีเพราะทุกไบต์ต้องใช้เวลาเท่ากันในการรับ ( ย่อหน้านี้ถอดความจากฉัน ) ดังนั้นเขาแนะนำ RAM (เหมือนในหน่วยความจำคอมพิวเตอร์) แทน DBs (นั่นคือสิ่งที่ฉันตีความคำแถลงของเขาในฐานะ) ไม่สมเหตุสมผลเพราะมันเหมือนกับการบอกว่าระเบียนทั้งหมดเป็นหน่วยความจำในการประมวลผลตลอดอายุการใช้งานของแอปพลิเคชัน …

3
การแบ่งพาร์ติชันตารางช่วยได้อย่างไร
ฉันมีปัญหาในการคว้าความคิดของข้อดีและข้อเสียของการแบ่งตาราง ฉันกำลังจะเริ่มทำงานในโครงการซึ่งจะมี 8 ตารางและหนึ่งในนั้นจะเป็นตารางข้อมูลหลักที่จะเก็บบันทึก 180-260 ล้าน เนื่องจากมันจะถูกทำดัชนีตารางอย่างถูกต้องดังนั้นฉันคิดว่าการ จำกัด ระเบียนของตารางไว้ที่ 20 ล้านด้วยวิธีนี้ฉันจะต้องสร้างตาราง 9-13 แต่ฉันไม่แน่ใจว่ามันจะปรับปรุงประสิทธิภาพได้อย่างไรเพราะพวกเขาจะนั่งอยู่บนเครื่องเดียวกัน (32GB RAM)? ฉันใช้ MySQL และตารางจะเป็น MyISAM และตารางใหญ่จะมีดัชนีในฟิลด์ id และไม่มีความซับซ้อนเพิ่มเติมเช่นการค้นหาข้อความแบบเต็มเป็นต้น โปรดแสดงการแบ่งตารางเทียบกับการแบ่งพาร์ติชันฐานข้อมูลด้วย

6
จัดเรียงเร็กคอร์ดในตารางโดยพลการ
ความต้องการทั่วไปเมื่อใช้ฐานข้อมูลคือการเข้าถึงระเบียนตามลำดับ ตัวอย่างเช่นถ้าฉันมีบล็อกฉันต้องการจัดลำดับโพสต์บล็อกของฉันใหม่ตามลำดับที่กำหนดเอง รายการเหล่านี้มักจะมีความสัมพันธ์มากมายดังนั้นฐานข้อมูลเชิงสัมพันธ์จึงดูสมเหตุสมผล วิธีแก้ปัญหาทั่วไปที่ฉันได้เห็นคือการเพิ่มคอลัมน์จำนวนเต็มorder: CREATE TABLE AS your_table (id, title, sort_order) AS VALUES (0, 'Lorem ipsum', 3), (1, 'Dolor sit', 2), (2, 'Amet, consect', 0), (3, 'Elit fusce', 1); จากนั้นเราสามารถจัดเรียงแถวตามorderเพื่อรับพวกเขาในลำดับที่เหมาะสม อย่างไรก็ตามดูเหมือนว่าเงอะงะ: ถ้าฉันต้องการย้ายระเบียน 0 ไปยังจุดเริ่มต้นฉันต้องเรียงลำดับใหม่ทุกระเบียน ถ้าฉันต้องการแทรกระเบียนใหม่ที่อยู่ตรงกลางฉันต้องเรียงลำดับใหม่ทุกระเบียนหลังจากนั้น หากฉันต้องการลบบันทึกฉันต้องเรียงลำดับใหม่ทุกระเบียนหลังจากนั้น มันง่ายที่จะจินตนาการถึงสถานการณ์เช่น: สองบันทึกมีเหมือนกัน order มีช่องว่างในorderระหว่างบันทึก สิ่งเหล่านี้สามารถเกิดขึ้นได้ง่าย ๆ ด้วยเหตุผลหลายประการ นี่เป็นวิธีการที่แอพพลิเคชั่นอย่าง Joomla ใช้: คุณสามารถยืนยันได้ว่าอินเทอร์เฟซที่นี่ไม่ดีและแทนที่จะเป็นมนุษย์แก้ไขตัวเลขโดยตรงพวกเขาควรใช้ลูกศรหรือลากและวาง - และคุณอาจถูกต้อง แต่เบื้องหลังสิ่งเดียวกันกำลังเกิดขึ้น …

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

2
การจัดการจำนวนผู้เช่าที่เพิ่มขึ้นในสถาปัตยกรรมฐานข้อมูลผู้เช่าหลายคน
การจัดการกับจำนวนลูกค้า (ผู้เช่า) ในเซิร์ฟเวอร์ทั่วไปที่มีฐานข้อมูลแยกกันสำหรับอินสแตนซ์ของผู้เช่าแต่ละรายของแอปพลิเคชันนั้นค่อนข้างตรงไปตรงมาและโดยปกติแล้วเป็นวิธีที่ถูกต้องในการทำเช่นนี้ ขณะนี้ฉันกำลังดูสถาปัตยกรรมสำหรับแอปพลิเคชันที่ผู้เช่าแต่ละรายมีอินสแตนซ์ฐานข้อมูลของตนเอง อย่างไรก็ตามปัญหาคือแอปพลิเคชันนี้จะมีผู้เช่าจำนวนมาก (5,000-10,000) ที่มีผู้ใช้จำนวนมากอาจจะ 2,000 สำหรับผู้เช่ารายเดียว เราจะต้องสนับสนุนการเติบโตของระบบโดยผู้เช่าหลายรายทุกสัปดาห์ นอกจากนี้ผู้เช่าทั้งหมดและผู้ใช้ของพวกเขาจะถูกนำเสนอด้วยกระบวนการเข้าสู่ระบบทั่วไป (เช่นผู้เช่าแต่ละคนไม่สามารถมี URL ของตัวเอง) ในการทำสิ่งนี้ฉันต้องการกระบวนการล็อกอินแบบรวมศูนย์และวิธีการในการเพิ่มฐานข้อมูลลงในระบบและลงทะเบียนผู้ใช้แบบไดนามิก กระบวนการลงทะเบียนและการสร้างฐานข้อมูลจะเป็นไปโดยอัตโนมัติอย่างมีประสิทธิภาพได้อย่างไร กระบวนการของการสร้างและการลงทะเบียนฐานข้อมูลผู้เช่าในระบบน่าจะทำให้เกิดปัญหาประสิทธิภาพหรือล็อค หากคุณคิดว่านี่อาจเป็นปัญหาใคร ๆ สามารถแนะนำวิธีบรรเทาได้บ้าง ฉันจะจัดการการพิสูจน์ตัวตนจากส่วนกลางในวิธีที่ข้อมูลรับรองผู้ใช้จะเชื่อมโยงกับฐานข้อมูลของผู้เช่าโดยเฉพาะได้อย่างไร แต่ผู้ใช้สามารถเข้าสู่ระบบผ่านหน้าทั่วไปได้ (เช่นทั้งหมดผ่าน URL การเข้าสู่ระบบเดียวกัน ) ผู้เช่าจะต้องสามารถเข้าสู่ระบบและการอนุญาตของตัวเอง แต่ระบบการเข้าสู่ระบบกลางจะต้องตระหนักถึงสิ่งเหล่านี้ ใครสามารถแนะนำวิธีการทำเช่นนี้? หากฉันต้องการ 'ลดขนาด' ด้วยการเพิ่มเซิร์ฟเวอร์ฐานข้อมูลหลาย ๆ คนใครสามารถแนะนำปัญหาที่ฉันอาจต้องจัดการกับการจัดการข้อมูลประจำตัวผู้ใช้ข้ามเซิร์ฟเวอร์ (การรับบทบาท ฯลฯ ) และวิธีการบางอย่างเพื่อบรรเทาปัญหาเหล่านั้น

2
ฉันจะแมปความสัมพันธ์ IS-A กับฐานข้อมูลได้อย่างไร
พิจารณาสิ่งต่อไปนี้: entity User { autoincrement uid; string(20) name; int privilegeLevel; } entity DirectLoginUser { inherits User; string(20) username; string(16) passwordHash; } entity OpenIdUser { inherits User; //Whatever attributes OpenID needs... I don't know; this is hypothetical } ผู้ใช้ประเภทต่าง ๆ (ผู้ใช้ที่ล็อกอินโดยตรงและผู้ใช้ OpenID) แสดงความสัมพันธ์ IS-A กล่าวคือผู้ใช้ทั้งสองประเภทเป็นผู้ใช้ ตอนนี้มีหลายวิธีที่สิ่งนี้สามารถแสดงใน RDBMS: วิธีที่หนึ่ง CREATE TABLE Users …

7
คอลัมน์ยาวส่งผลกระทบต่อประสิทธิภาพและการใช้งานดิสก์อย่างไร
ในโครงการปัจจุบันของเรามันเกิดขึ้นบ่อยเกินไปที่เราต้องขยายคอลัมน์ด้วยตัวละครสองสามตัว จากvarchar(20)ไปvarchar(30)เรื่อย ๆ ในความเป็นจริงมันมีความสำคัญมากแค่ไหน? สิ่งนี้ดีเพียงใด ผลกระทบของการอนุญาตเพียงแค่ 100 หรือ 200 หรือแม้กระทั่ง 500 ตัวอักษรสำหรับช่อง "อินพุต" ปกติคืออะไร อีเมลสามารถมีได้เพียง 320 ตัวอักษรดังนั้นตกลง - มีข้อ จำกัด ที่ดี แต่สิ่งที่ฉันจะได้รับถ้าฉันตั้งไว้ที่ 200 เพราะฉันไม่ได้คาดหวังที่อยู่อีเมลนานกว่านั้น โดยปกติตารางของเราจะไม่มีแถวมากกว่า 100,000 แถวและมีคอลัมน์มากถึง 20 หรือ 30 คอลัมน์ เราใช้ SQL Server 2008 ตอนนี้ แต่มันน่าสนใจที่จะทราบว่า DBs ต่างกันจัดการกับปัญหานี้อย่างไร ในกรณีที่ผลกระทบต่ำมาก - อย่างที่ฉันคาดไว้มันจะช่วยให้ได้ข้อโต้แย้งที่ดี (สำรองข้อมูลด้วยการเชื่อมโยง?) เพื่อโน้มน้าวใจ DBA ของฉันว่าความหวาดระแวงระยะยาวนี้ไม่จำเป็นจริงๆ ในกรณีที่เป็นฉันอยู่ที่นี่เพื่อเรียนรู้ :-)

4
ฉันควรอัปเดตอย่างชัดเจนไปยังคอลัมน์ที่ไม่ควรอัปเดตหรือไม่
ฉันคุ้นเคยกับการทำงานในสภาพแวดล้อมที่ปลอดภัยและดังนั้นฉันจึงออกแบบการอนุญาตของฉันให้ดีมาก สิ่งหนึ่งที่ฉันทำตามปกติคือDENYผู้ใช้สามารถระบุUPDATEคอลัมน์ที่ไม่ควรอัปเดตได้อย่างชัดเจน ตัวอย่างเช่น: create table dbo.something ( created_by varchar(50) not null, created_on datetimeoffset not null ); คอลัมน์สองเหล่านี้ไม่ควรเปลี่ยนแปลงเมื่อมีการตั้งค่า ดังนั้นผมจะชัดเจนรับอนุญาตเกี่ยวกับพวกเขาDENYUPDATE เมื่อเร็ว ๆ นี้ในระหว่างการประชุมทีมนักพัฒนาได้ยกประเด็นที่ตรรกะเพื่อให้แน่ใจว่าเขตข้อมูลที่ไม่เคยได้รับการปรับปรุงควรจะอยู่ในเลเยอร์แอปพลิเคชันและไม่ใช่ชั้นฐานข้อมูลในกรณีที่ "พวกเขาจำเป็นต้องปรับปรุงค่า สำหรับฉันแล้วดูเหมือนว่าความคิด dev ทั่วไป (ฉันรู้ว่าฉันเคยเป็นหนึ่ง!) ฉันเป็นสถาปนิกอาวุโสที่ บริษัท ของฉันและฉันได้ทำงานตามหลักการของสิทธิพิเศษจำนวนน้อยที่สุดที่ต้องใช้เพื่อให้แอปทำงานได้ สิทธิ์ทั้งหมดจะได้รับการตรวจสอบเป็นประจำ แนวปฏิบัติที่ดีที่สุดในสถานการณ์นี้คืออะไร?

4
จะสร้างตารางแยกต่างหากสำหรับผลิตภัณฑ์ประเภทต่างๆหรือไม่?
ฉันกำลังออกแบบฐานข้อมูลและฉันมีความคิดที่สองเกี่ยวกับการตัดสินใจออกแบบเริ่มต้นของฉัน ... ประเภทสินค้ามีดังนี้ ... รุ่นชิ้นส่วนชุดอุปกรณ์ทดแทนและตัวเลือก ตัวเลือก A (การออกแบบครั้งแรก): ฉันวางแผนที่จะมีตารางแยกต่างหากสำหรับผลิตภัณฑ์ประเภทข้างต้น ฉันจะบอกว่าประมาณ 75% ของเขตข้อมูลจะเหมือนกันในแต่ละตาราง ฉันสร้างผลิตภัณฑ์แต่ละประเภทเป็นตารางแยกเนื่องจากความสัมพันธ์ที่ฉันต้องการสร้างระหว่างแต่ละประเภท ตัวอย่างเช่นรุ่นสามารถมีตัวเลือกมากมายและตัวเลือกสามารถมีหลายรุ่น ตัวเลือกยังสามารถมีได้หลายส่วนและส่วนหนึ่งสามารถมีตัวเลือกมากมาย ... และอื่น ๆ ... ตัวเลือก B: แทนที่จะมีตารางแยกกันฉันสามารถสร้างตารางชื่อผลิตภัณฑ์ที่ครอบคลุมโมเดลส่วนชิ้นส่วนชุดอุปกรณ์ทดแทนและตัวเลือกต่างๆ ฉันสามารถมีหนึ่งฟิลด์ที่เรียกว่าชนิดเพื่อแยกความแตกต่างระหว่างรุ่นตัวเลือกและอื่น ๆ ฉันคิดว่าข้อเสียคือหลาย ๆ ฟิลด์จะไม่ถูกใช้ (ซ้ายเป็นโมฆะ) สำหรับผลิตภัณฑ์บางประเภท ฉันเดาว่านี่คือสิ่งที่ "ไม่ปฏิบัติที่ดีที่สุด" จะเข้ามาเล่น .. ตัวเลือก B จะช่วยลดความซับซ้อนของการออกแบบฐานข้อมูลได้อย่างมาก ฉันไม่ต้องกังวลเกี่ยวกับการอ้างอิงกลุ่มของตารางเมื่อดึงข้อมูลออกมาเพื่อสอบถาม ...

7
กำลังจัดเก็บที่อยู่ IP
ฉันต้องเก็บที่อยู่ IP ของผู้ใช้ที่ลงทะเบียนทั้งหมดในฐานข้อมูล ฉันสงสัยว่าฉันควรประกาศตัวละครในคอลัมน์นี้กี่ตัว? ฉันควรสนับสนุน IPv6 ด้วยหรือไม่ ถ้าเป็นเช่นนั้นความยาวสูงสุดของที่อยู่ IP คืออะไร?

5
มีวิธีใดบ้างในการใช้ความสัมพันธ์แบบหลายต่อหลายคนในคลังข้อมูล
ทอพอโลยีที่โดดเด่นของการสร้างแบบจำลอง Data Warehouse (Star, Snowflake) ได้รับการออกแบบโดยคำนึงถึงความสัมพันธ์แบบหนึ่งต่อหลายคน ความสามารถในการอ่านแบบสอบถามประสิทธิภาพและโครงสร้างจะลดลงอย่างรุนแรงเมื่อต้องเผชิญกับความสัมพันธ์แบบหลายต่อหลายคนในรูปแบบการสร้างแบบจำลองเหล่านี้ มีวิธีใดบ้างในการนำความสัมพันธ์แบบหลายต่อหลายอย่างมาใช้ระหว่างมิติข้อมูลหรือระหว่างตารางข้อเท็จจริงกับมิติข้อมูลในคลังข้อมูลและสิ่งที่ทำให้เกิดความเสียหายนั้นเกี่ยวข้องกับความละเอียดและประสิทธิภาพของแบบสอบถามที่จำเป็น?

7
ปัญหาใดที่แก้ไขได้โดยแยกที่อยู่เป็นคอลัมน์แต่ละคอลัมน์
เรามีทีมงานที่ออกแบบตารางและความสัมพันธ์สำหรับนักพัฒนาซอฟต์แวร์ ในองค์กรของเราพวกเขาค่อนข้างเข้มงวดเกี่ยวกับการบังคับใช้มาตรฐาน 3NF ซึ่งโดยความจริงแล้วฉันเห็นด้วยกับขนาดองค์กรของเราและความต้องการหรือลูกค้าของเราเปลี่ยนแปลงไปตามกาลเวลาอย่างไร มีเพียงส่วนเดียวที่ฉันไม่ชัดเจนเกี่ยวกับเหตุผลที่อยู่เบื้องหลังการตัดสินใจออกแบบ: ที่อยู่ แม้ว่าสิ่งนี้จะเน้นที่ที่อยู่ในสหรัฐอเมริกาเป็นส่วนใหญ่ แต่ฉันคิดว่าสิ่งนี้สามารถใช้ได้กับทุกประเทศที่ทำสิ่งนี้ ที่อยู่แต่ละส่วนจะได้รับคอลัมน์ของตนเองในตารางที่อยู่ ตัวอย่างเช่นใช้ที่อยู่ gnarly US นี้: Attn: Jane Doe 485 1/2 N Smith St SW, APT 300B Chicago, IL 11111-2222 มันจะถูกแยกย่อยในฐานข้อมูลดังนี้: ถนนหมายเลข: 485 เศษถนน: 1/2 ทิศทางก่อนถนน: N (เหนือ) ชื่อถนน: Smith ประเภทถนน: ST (ถนน) ทิศทางหลังถนน: SW (ตะวันตกเฉียงใต้) เมือง: ชิคาโก รัฐ: IL (อิลลินอยส์) รหัสไปรษณีย์: 11111 …

3
ข้อ จำกัด ในการบังคับใช้“ อย่างน้อยหนึ่ง” หรือ“ หนึ่งอย่าง” ในฐานข้อมูล
สมมติว่าเรามีผู้ใช้และผู้ใช้แต่ละคนสามารถมีที่อยู่อีเมลได้หลายที่อยู่ CREATE TABLE emails ( user_id integer, email_address text, is_active boolean ) แถวตัวอย่างบางส่วน user_id | email_address | is_active 1 | foo@bar.com | t 1 | baz@bar.com | f 1 | bar@foo.com | f 2 | ccc@ddd.com | t ฉันต้องการบังคับใช้ข้อ จำกัด ที่ผู้ใช้ทุกคนมีที่อยู่หนึ่งที่แน่นอน ฉันจะทำสิ่งนี้ใน Postgres ได้อย่างไร ฉันสามารถทำสิ่งนี้: CREATE UNIQUE INDEX "user_email" ON …

1
วิธีการตรวจสอบว่ามี [การเชื่อมต่อที่ไม่ได้ใช้งานกับ] ธุรกรรมที่ไม่มีข้อผูกมัดใน PostgreSQL หรือไม่
ตามความเห็นเกี่ยวกับคำถามนี้ฉันถามเกี่ยวกับการเชื่อมต่อที่ไม่ได้ใช้งานใน PostgreSQL 9.2ธุรกรรมบางอย่างที่ไม่ได้รับการติดต่อ (อาจเกี่ยวข้องกับการเชื่อมต่อที่ไม่ได้ใช้งาน) อาจทำให้เกิดปัญหาประสิทธิภาพการทำงาน เป็นวิธีที่ดีในการตรวจสอบว่ามีการทำธุรกรรมที่ปราศจากข้อผูกมัด (คะแนนโบนัสหากมีวิธีที่จะรู้ว่าพวกเขากำลังเชื่อมต่ออยู่ไม่ได้ใช้งานหรือไม่)? ขอบคุณมาก ๆ!

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