คนเขียนฐานข้อมูลของตัวเองด้วยเหตุผลบางอย่าง?
คนเขียนฐานข้อมูลของตัวเองด้วยเหตุผลบางอย่าง?
คำตอบ:
เราทำอย่างนั้นหวังว่า Ben Z จะให้เหตุผลที่ดีกว่าที่ฉันสามารถทำได้เพราะเขาเป็นผู้เขียนฐานข้อมูลดั้งเดิมของเรา รุ่นสั้นคือฐานข้อมูลเชิงสัมพันธ์นั้นไม่มีประโยชน์มากสำหรับเกมเนื่องจากไม่สามารถจัดเก็บข้อมูลแบบลำดับชั้นที่มีโครงสร้างอย่างหนักซึ่งทำให้ข้อมูลส่วนใหญ่ที่ MMO ต้องการสำหรับการทำงานปกติ เราเลือกที่จะสร้างฐานข้อมูลวัตถุที่กำหนดเองและเป็นส่วนหนึ่งของระบบประมวลผลธุรกรรมแบบกระจายซึ่งขณะนี้อยู่ระหว่างการผลิตและเปิดเกมสดสองเกมของเรา
สำหรับถ้าคุณควรทำเช่นเดียวกัน? อาจไม่อย่างน้อยไม่ในตอนแรก ฉันจะยังคงสนับสนุนการหลีกเลี่ยง SQL แต่ตอนนี้มีตัวเลือกมากมายในโลก "NoSQL" ที่ไม่ได้มีอยู่ไม่กี่ปีที่ผ่านมา
ที่กล่าวมา MMO ส่วนใหญ่รันบนฐานข้อมูล SQL (เชิงสัมพันธ์) ฉันรู้ว่าอีฟทำงานบนการติดตั้ง SQL Server ซึ่งอยู่ด้านบนของ RAMSAN ที่มีหลาย TB (ฉันอาจจะไม่เคยมีเงินมากเท่ากับสิ่งที่คิดค่าใช้จ่าย)
แก้ไข: หวังว่าเขาจะไม่รังเกียจที่ฉันโพสต์สิ่งนี้ที่นี่ แต่นี่เป็นรายการบล็อกที่มีลิงก์และความคิดเห็นเกี่ยวกับงานนำเสนอที่ GDC'08 เกี่ยวกับฐานข้อมูลของเรา
เอาล่ะคำตอบนี้เป็นข้อสังเกตมากกว่า
การเปิดเผยแบบเต็มฉันไม่ได้ทำงานกับ MMORPG ฉันได้ทำงานในสิ่งที่เป็นหนึ่งใน 10 อันดับแรกของเว็บไซต์ที่มีผู้เข้าชมมากที่สุดในปี 2009 และฉันได้ทำงานกับ บริษัท เกมเอ็นจิ้นที่คิดว่าพวกเขากำลังสร้างเทคโนโลยี MMORPG (ฉันไม่รู้ว่าจัดส่งแล้ว)
ถ้าคุณดู บริษัท ที่ประสบความสำเร็จในระดับสูง (Google, Facebook, Twitter, ฯลฯ ) ฉันรู้ว่าพวกเขาไม่ใช่ บริษัท เกม แต่พวกเขาน่าดูในพื้นที่นี้) มีสองสิ่งที่ฉันคิดว่าสำคัญ
ข้อผิดพลาดใหญ่คือการคว้าสิ่งที่มีค่าใช้จ่ายสูงและคาดว่ามันจะเพิ่มขนาดอย่างน่าอัศจรรย์สำหรับคุณ มันไม่ทำงานอย่างนั้น กุญแจสำคัญในการเพิ่มขนาดคือการจัดการกับความท้าทายใหม่ ๆ อย่างเหมาะสม คุณต้องการความยืดหยุ่นในการแก้ปัญหาที่ใช้งานง่ายที่คุณสามารถย้ายเข้าและออกได้อย่างง่ายดาย
ดังนั้นคำแนะนำของฉันต่อคุณก็คือถ้าคุณเริ่มออกไปลองทำในสิ่งที่ปวดหัวน้อยที่สุด
โดยทั่วไปมีวิธีการที่หลากหลายและฉันคิดว่าพวกเขาได้รับการคัดเลือกตามประสบการณ์ของนักพัฒนาของพวกเขามากเท่ากับคุณสมบัติของฐานข้อมูล ที่ปลายด้านหนึ่ง MMO จำนวนมากกำลังใช้ฐานข้อมูลเชิงสัมพันธ์มาตรฐานเช่น Dark Ages of Camelot ใช้งาน / ใช้งาน (ยังอยู่หรือไม่) MySQL , FreeRealms ใช้Postgresql ที่แก้ไขแล้ว ฯลฯ
คุณมี Guild Wars: พวกเขาใช้ SQL Serverแต่พวกเขาเก็บข้อมูลไว้ในนั้นเป็น BLOB เดียว ซึ่งหมายความว่าพวกเขาได้รับประโยชน์จากรูปแบบไบนารี่ปกติของพวกเขาพร้อมกับสิทธิประโยชน์บางส่วนที่ฐานข้อมูลมอบให้ คุณอาจจะเห็นข้อเสียของวิธีการนี้เช่นกัน แต่สำหรับ บริษัท ที่เคยทำงานกับไฟล์แบบแบนก็อาจยังคงเป็นขั้นตอนต่อไป
จากนั้นอาจมีบางสถานที่ที่ใช้แนวทาง NoSQL ที่เป็นทางการแม้ว่ามันจะยังเร็ววัน Farmville ใช้membaseซึ่งพวกเขาทำขึ้นเพื่อจุดประสงค์โดยอิงจาก memcached คุณลักษณะนี้มีการแชร์หลาย ๆ อย่างเช่น MongoDB, CouchDB และอื่น ๆ อีกมากมายด้วยวิธีการเหล่านี้โดยทั่วไปแล้วคุณจะกลิ้งรูปแบบการจัดเก็บของคุณเอง แต่ได้รับประโยชน์จากการกระจายแคชแคชซ้ำซ้อน ฯลฯ
บางคนกำลังกลิ้ง NoSQL ของตัวเองโดยสิ้นเชิง: Cryptic กล่าวว่าพวกเขาทำสิ่งที่คล้ายกันแต่ก็บอกว่าพวกเขาไม่ได้ใช้มันในการผลิต ( แก้ไข : แต่ดูความคิดเห็นด้านล่าง)
และจากนั้นคุณก็มาถึงคนที่ใช้ไฟล์ข้อความหรือไฟล์ไบนารี - ฉันเข้าใจว่าเกมเก่า ๆ อย่าง Ultima Online, Everquest และอื่น ๆ ล้วนแล้วแต่เป็นเส้นทางนี้และสำหรับ บริษัท ที่มีประสบการณ์การพัฒนาเกม เกินไป.
โปรดทราบว่าคุณแทบจะไม่ต้องเขียนฐานข้อมูลของตัวเองในแง่ที่หลวม - ในเกมคุณจะมีข้อมูลแบบ bespoke ที่คุณต้องจัดการทั้งในหน่วยความจำหรือบนดิสก์ด้วยวิธีที่ไม่ได้ยืมตัวเอง ซอฟต์แวร์ทั่วไป คุณไม่สามารถทำการสืบค้น SQL ทุกครั้งที่คุณต้องการข้อมูลบางอย่างดังนั้นคุณจะต้องทำการมิเรอร์ข้อมูลจำนวนมากในโค้ดไม่ว่าคุณจะใช้งานอะไร
ใน Pirates of the Burning Sea เราจ้องไปที่ MySQL (แม้ว่าโดยสุจริตฉันจะชอบ Postgres) และเมื่อมันเริ่มล้มลงภายใต้การโหลดเราเปลี่ยนไปใช้ Microsoft SQL Server แม้ว่าในความจริงแล้วฉันอาจจะไม่ไปเส้นทางนั้นอีกในอนาคต ข้อมูล PotBS ส่วนใหญ่ได้รับการจัดลำดับล่วงหน้าก่อนที่จะยังคงอยู่ดังนั้นส่วนใหญ่ของสิ่งที่อยู่ใน DB จึงไม่มีอะไรมากไปกว่าที่เก็บคีย์ / ค่าที่รก นอกเหนือจากนั้นเพื่อให้ได้ประสิทธิภาพที่ดีขึ้นจากชั้นการคงอยู่ของเราและการควบคุมวิธีการที่แคชข้อมูลในหน่วยความจำได้ดียิ่งขึ้นเราได้เขียนเซิร์ฟเวอร์แคชที่อยู่หน้าฐานข้อมูล
ดังนั้น Kylotan ที่ถูกต้องคุณจะไม่ได้หมุนตัวเองในระดับหนึ่ง เซิร์ฟเวอร์ฐานข้อมูลเชิงสัมพันธ์ของ SQL ไม่ได้ออกแบบมาสำหรับวิธีที่เกมใช้ข้อมูล แทนที่จะสมมติว่าเซิร์ฟเวอร์ฐานข้อมูลเชิงสัมพันธ์เป็นจุดสิ้นสุดของฐานข้อมูลทั้งหมดเราควรจะคิดถึงสิ่งที่เป็นประโยชน์ที่เรากำลังมองหาก่อนเลือกเครื่องมือ
ครั้งต่อไปฉันจะลองดูสิ่งต่าง ๆ เช่น BerkleyDB หรือบางส่วนของสไตล์ NoSQL อื่น ๆ
สิ่งอื่นที่ควรทราบคือถ้าคุณมีชุดข้อมูลสแตติก (ค่อนข้าง) อย่าเก็บไว้ในฐานข้อมูล! ไม่มีเหตุผลที่ดีจริงๆในการจัดเก็บคำจำกัดความการสะกดคำจำกัดความของรายการแผนที่ ฯลฯ ในฐานข้อมูล คุณไม่ค่อยทำการสืบค้นยกเว้นโดยใช้ชื่อ ฉันเห็นผู้คนมากมายกระโดดเข้าสู่การพัฒนาเกมโดยเก็บข้อมูลเหล่านี้ไว้ข้างๆข้อมูลผู้เล่นที่มีอยู่และมันเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
คุณต้องมีแหล่งข้อมูลเช่นเดียวกับระบบไฟล์สำหรับสิ่งเหล่านี้ นอกเหนือจากการพัฒนาคุณไม่ต้องการกรดคุณไม่ต้องการ CRUD คุณไม่ต้องการฐานข้อมูลสำหรับข้อมูลประเภทนั้น ในการพัฒนาคุณจำเป็นต้องมีฐานข้อมูล แต่คุณก็ต้องใช้ VCS ด้วยเช่นกันและตัวเลือกของ VCS จะทำให้ตัวเลือกฐานข้อมูลนั้นเหมาะกับคุณ
(หากคุณกำลังทำงานกับเกมที่ผู้เล่นสามารถสร้างคาถาหรือไอเท็มหรือเควสที่กำหนดเองได้ข้อมูลก็จะเหมือนกับข้อมูลของผู้เล่นและคุณต้องการฐานข้อมูลอีกครั้ง)
MMORPGs เป็นแอพที่เข้มข้นและเป็นภารกิจที่ยิ่งใหญ่ หากคุณเริ่มต้นด้วยการพัฒนาเกมฉันขอแนะนำให้คุณทำอะไรเล็กลง
ที่กล่าวว่าคุณจะต้องมีประสิทธิภาพสูงสุดสองบีบออกจากการตั้งค่าของคุณ เห็นได้ชัดว่าคุณต้องการเซิร์ฟเวอร์ฟาร์ม / กลุ่ม เนื่องจากการสื่อสารผ่านเครือข่ายมีราคาค่อนข้างแพง (และ MMORPG ส่วนใหญ่เป็นเรียลไทม์) คุณอาจต้องการทำซ้ำฐานข้อมูลกลางของคุณไปยังเซิร์ฟเวอร์เกมแต่ละเกมของคุณ (เทียบเท่ากับการจำลองแบบเวลาแฝงต่ำแบบเรียลไทม์
หากเซิร์ฟเวอร์แต่ละเครื่องของคุณให้บริการเฉพาะส่วนของโลกเกม (เช่น WoW ใช้งานได้); สิ่งที่ต้องการกระจายแบ่งเป็นผู้ชม DPV ช่วยให้คุณสามารถแบ่งกลุ่มแถวของฐานข้อมูลของคุณในเซิร์ฟเวอร์ต่างๆ ตามข้อ จำกัด ของคอลัมน์ในแต่ละเซิร์ฟเวอร์ ทั้ง MSSQL และ Oracle ฉลาดพอที่จะพูดคุยกับเซิร์ฟเวอร์ที่มีข้อมูลที่อยู่ในอนุประโยค WHERE หรือ ON ของคุณเท่านั้น ฉันไม่แน่ใจว่าข้อเสนอโอเพนซอร์สใด ๆ มี DPV หรือไม่
ผลลัพธ์สุทธิของสิ่งนี้คือมันไม่สำคัญว่าคุณจะใช้ฐานข้อมูลเพียงแค่ใช้ชื่อที่ดี: MSSQL, Oracle, MySQL, PostgreSQL เขียนฐานข้อมูลของคุณใน ANSI SQL และดูว่าระบบใดทำงานได้ดีที่สุดซึ่งเป็นวิธีเดียวที่จะค้นหา
เส้นทาง NoSQL อาจเป็นความคิดที่ดีเพราะมันถูกออกแบบมาสำหรับการทำงานพร้อมกันสูง คำแนะนำของ Pranny อาจใช้เล่ห์เหลี่ยม
ฉันใช้ MongoDB (NoSQL) มันเป็นที่เก็บเอกสารที่รวดเร็วที่สามารถเข้าถึงได้ผ่าน TCP ให้มันลอง! มันเจ๋งมาก!
การเขียนฐานข้อมูลของคุณเองเป็นภารกิจที่น่ากลัว ฉันขอแนะนำให้คุณสำรวจสิ่งที่มีอยู่แล้วและหากคุณไม่สามารถหาสิ่งที่ตรงกับเกณฑ์ที่คุณกำหนดให้สร้างของคุณเอง โอ้และอย่าลืมที่จะเปิดแหล่งที่มา :)
ฉันเดาว่ามันขึ้นอยู่กับว่าคุณต้องการเก็บข้อมูลประเภทใดและภายใต้รูปแบบใด
ฉันคิดว่าคนส่วนใหญ่ใช้ฐานข้อมูล SQL "มาตรฐาน" สำหรับข้อมูล "ไดนามิก" เช่นข้อมูลผู้เล่นไม่ว่าจะเป็น SQL Server, MySQL, PostgreSQL
อย่างไรก็ตามข้อมูล "ภายใน" (สถานะของโลก, เนื้อหา, .... ) สามารถเก็บไว้ในรูปแบบใด ๆ และฉันเดาว่า บริษัท ส่วนใหญ่จะเขียนระบบฐานข้อมูลที่กำหนดเองอย่างน้อยบางส่วนสำหรับส่วนนั้นซึ่งเหมาะสมกับความต้องการเฉพาะของพวกเขา .
จริง ๆ แล้วมันขึ้นอยู่กับใบสมัครของคุณ ฉันทำงานที่เราพัฒนาเกม RPG ทางสังคมและเราใช้ Google App Engine เป็นแบ็กเอนด์
คำถามนี้ค่อนข้างเก่า แต่ความคิดของฉันเกี่ยวกับวิธีการจัดการมันถูกต้องตามที่ถูกถามเหมือนวันนี้
หากคุณกำลังใช้ฐานข้อมูลเชิงสัมพันธ์คุณจะต้องลดภาระของมันลงเพื่อให้แนวคิดนี้น่าจะช่วยได้
เก็บข้อมูลสาธารณะทั้งหมดบนฐานข้อมูลโลคัลบนระบบไคลเอ็นต์แต่ละระบบรวมถึงในฐานข้อมูลเซิร์ฟเวอร์
จัดเก็บตารางทั้งหมดด้วยรายการในฐานข้อมูลลูกค้า แทนที่จะมองหาไคลเอนต์ไปยังเซิร์ฟเวอร์เมื่อคุณวางเมาส์เหนืออาวุธเพื่อดูสถิติลูกค้าเพียงแค่ตรวจสอบสถิติฐานข้อมูลในเครื่อง เซิร์ฟเวอร์มีฐานข้อมูลของตัวเองสำหรับดึงสถิติเมื่อทำการคำนวณและส่งต่อความเสียหายและสุขภาพที่เหลือให้กับลูกค้า
กรณีที่เลวร้ายที่สุดกับความคิดนี้คือทุกคนสามารถดูสถิติของอาวุธทั้งหมดหากพวกเขาจัดการเพื่อเข้าไปในฐานข้อมูลลูกค้า มันไม่สำคัญว่าจะเกิดจากแม้ว่าพวกเขาจะเปลี่ยนค่า แต่ค่าฐานข้อมูลบนเซิร์ฟเวอร์นั้นเป็นสิ่งที่คำนวณได้ในเกม