Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2การเริ่มต้นใช้งาน - ดูส่วนที่ 1

3. ความหลากหลายของโครงสร้างเมื่อใช้โกลบอล

โครงสร้างเช่นต้นไม้สั่งมีกรณีพิเศษมากมาย ลองพิจารณาสิ่งที่มีคุณค่าในทางปฏิบัติเมื่อทำงานกับ globals

3.1 กรณีพิเศษ 1. หนึ่งโหนดที่ไม่มีสาขา


Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2Globals สามารถใช้ได้ไม่เพียงแต่เหมือนกับอาร์เรย์เท่านั้น แต่ยังสามารถใช้ได้เหมือนกับตัวแปรปกติอีกด้วย ตัวอย่างเช่น เป็นตัวนับ:

Set ^counter = 0  ; установка счётчика
Set id=$Increment(^counter) ;  атомарное инкрементирование

ในกรณีนี้ ทั่วโลก นอกเหนือจากความหมายของมันแล้ว ยังสามารถมีสาขาได้อีกด้วย หนึ่งไม่ได้ยกเว้นอีกคนหนึ่ง

3.2 กรณีพิเศษ 2. จุดยอดเดียวและหลายกิ่ง

โดยทั่วไป นี่คือฐานคีย์-ค่าแบบคลาสสิก และถ้าเราบันทึกค่าจำนวนหนึ่งเป็นค่า เราก็จะได้ตารางธรรมดาๆ ที่มีคีย์หลัก

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2

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

  1. อักขระตัวคั่น
    Set ^t(id1) = "col11/col21/col31"
    Set ^t(id2) = "col12/col22/col32"
  2. รูปแบบที่เข้มงวดซึ่งแต่ละฟิลด์ครอบครองจำนวนไบต์ที่กำหนดไว้ล่วงหน้า เช่นเดียวกับที่ทำในฐานข้อมูลเชิงสัมพันธ์
  3. ฟังก์ชันพิเศษ $LB (มีอยู่ในแคช) ซึ่งสร้างสตริงของค่า
    Set ^t(id1) = $LB("col11", "col21", "col31")
    Set ^t(id2) = $LB("col12", "col22", "col32")

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

มาสร้างดัชนีทั่วโลกในคอลัมน์แรกกัน

Set ^i("col11", id1) = 1
Set ^i("col12", id2) = 1

ตอนนี้ หากต้องการค้นหาข้อมูลอย่างรวดเร็วในคอลัมน์แรก เราต้องพิจารณาข้อมูลทั่วโลก ^i และค้นหาคีย์หลัก (id) ที่สอดคล้องกับค่าที่ต้องการของคอลัมน์แรก

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

TSTART
Set ^t(id1) = $LB("col11", "col21", "col31")
Set ^i("col11", id1) = 1
TCOMMIT

รายละเอียดเกี่ยวกับวิธีการทำบน M ตารางบนโกลบอล, การจำลองดัชนีรอง.

ตารางดังกล่าวจะทำงานได้รวดเร็วเหมือนกับในฐานข้อมูลแบบดั้งเดิม (หรือเร็วกว่านั้น) หากฟังก์ชันสำหรับการแทรก/อัปเดต/ลบแถวเขียนใน COS/M และคอมไพล์แล้วฉันตรวจสอบคำสั่งนี้ด้วยการทดสอบ INSERT จำนวนมากและ SELECT ลงในตารางสองคอลัมน์เดียว รวมถึงการใช้คำสั่ง TSTART และ TCOMMIT (ธุรกรรม)

ฉันยังไม่ได้ทดสอบสถานการณ์ที่ซับซ้อนมากขึ้นด้วยการเข้าถึงพร้อมกันและธุรกรรมแบบขนาน

โดยไม่ต้องใช้ธุรกรรม อัตราการแทรกคือ 778 เม็ดต่อวินาทีต่อล้านค่า
ด้วยค่า 300 ล้านค่า - 422 เม็ดมีด/วินาที

เมื่อใช้ธุรกรรม - 572 เม็ดมีด/วินาทีสำหรับเม็ดมีด 082M การดำเนินการทั้งหมดดำเนินการจากโค้ด M ที่คอมไพล์แล้ว
ฮาร์ดไดรฟ์เป็นปกติไม่ใช่ SSD RAID5 พร้อมการเขียนกลับ โปรเซสเซอร์ฟีนอม II 1100T

ในการทดสอบฐานข้อมูล SQL ในทำนองเดียวกัน คุณต้องเขียนขั้นตอนการจัดเก็บที่จะทำการแทรกในลูป เมื่อทดสอบ MySQL 5.5 (พื้นที่เก็บข้อมูล InnoDB) โดยใช้วิธีนี้ ฉันได้รับการแทรกตัวเลขไม่เกิน 11 รายการต่อวินาที
ใช่ การใช้งานตารางบน Globals ดูซับซ้อนกว่าในฐานข้อมูลเชิงสัมพันธ์ ดังนั้นฐานข้อมูลอุตสาหกรรมบน globals จึงสามารถเข้าถึง SQL เพื่อทำให้การทำงานกับข้อมูลแบบตารางง่ายขึ้น

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2โดยทั่วไปหากสคีมาข้อมูลไม่เปลี่ยนแปลงบ่อย ๆ ความเร็วในการแทรกก็ไม่สำคัญและสามารถแสดงฐานข้อมูลทั้งหมดในรูปแบบของตารางมาตรฐานได้อย่างง่ายดาย ดังนั้นการทำงานกับ SQL จะง่ายกว่าเนื่องจากให้ระดับนามธรรมที่สูงกว่า .

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2ในกรณีนี้ ผมอยากจะแสดงสิ่งนั้น globals สามารถทำหน้าที่เป็นตัวสร้างสำหรับการสร้างฐานข้อมูลอื่น ๆ. เหมือนแอสเซมเบลอร์ที่สามารถเขียนภาษาอื่นได้ นี่คือตัวอย่างวิธีที่คุณสามารถสร้างแอนะล็อกบนโกลบอลส์ คีย์-ค่า รายการ ชุด ตาราง ฐานข้อมูลเชิงเอกสาร

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

3.3 กรณีพิเศษ 3. ต้นไม้สองระดับ แต่ละโหนดของระดับที่สองมีจำนวนสาขาคงที่

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2คุณคงเดาได้: นี่คือการนำตารางไปใช้อีกทางหนึ่งบน globals ลองเปรียบเทียบการใช้งานนี้กับอันก่อนหน้า

โต๊ะบนต้นไม้สองระดับเทียบกับ บนต้นไม้ชั้นเดียว

cons
ข้อดี

  1. แทรกช้าลง เนื่องจากคุณต้องตั้งค่าจำนวนโหนดเท่ากับจำนวนคอลัมน์
  2. การใช้พื้นที่ดิสก์มากขึ้น เนื่องจากดัชนีโกลบอล (เรียกว่าดัชนีอาร์เรย์) ที่มีชื่อคอลัมน์จะใช้พื้นที่ดิสก์และทำซ้ำสำหรับแต่ละแถว

  1. เข้าถึงค่าของแต่ละคอลัมน์ได้เร็วขึ้น เนื่องจากไม่จำเป็นต้องแยกวิเคราะห์สตริง จากการทดสอบของฉัน มันเร็วขึ้น 11,5% ใน 2 คอลัมน์ และมากขึ้นในจำนวนคอลัมน์ที่มากขึ้น
  2. ง่ายต่อการเปลี่ยนสคีมาข้อมูล
  3. รหัสที่ชัดเจนมากขึ้น

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

3.4 กรณีทั่วไป ต้นไม้และสั่งต้นไม้

โครงสร้างข้อมูลใด ๆ ที่สามารถแสดงเป็นแผนภูมิได้ลงตัวกับโกลบอล

3.4.1 วัตถุที่มีวัตถุย่อย

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2

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

ลองนึกภาพฐานข้อมูล SQL ของตาราง: "ผู้ป่วย" ~ 100 ฟิลด์, "ยา" - 000 ฟิลด์, "การบำบัด" - 100 ฟิลด์, "ภาวะแทรกซ้อน" - 000 ฟิลด์ ฯลฯ และอื่น ๆ หรือคุณสามารถสร้างฐานข้อมูลจำนวนหลายพันตาราง โดยแต่ละตารางสำหรับผู้ป่วยแต่ละประเภท (และสามารถทับซ้อนกันได้!) การรักษา ยา และตารางอีกหลายพันตารางสำหรับการเชื่อมต่อระหว่างตารางเหล่านี้

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

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

.
แน่นอนว่าใน SQL คุณสามารถจำลองแผนผังที่มีเพียงไม่กี่ตารางได้ (อีเอวี, 1,2,3,4,5,6,7,8,9,10) อย่างไรก็ตาม สิ่งนี้ซับซ้อนกว่ามากและจะช้าลงอย่างมาก โดยพื้นฐานแล้ว คุณจะต้องเขียน Global ที่ทำงานบนตารางและซ่อนงานทั้งหมดด้วยตารางภายใต้เลเยอร์นามธรรม เป็นการผิดที่จะเลียนแบบเทคโนโลยีระดับล่าง (globals) โดยใช้เทคโนโลยีระดับสูงกว่า (SQL) ไม่เหมาะสม.

ไม่มีความลับใดที่การเปลี่ยนสคีมาข้อมูลบนโต๊ะขนาดยักษ์ (ALTER TABLE) อาจใช้เวลานานพอสมควร ตัวอย่างเช่น MySQL ทำ ALTER TABLE ADD|DROP COLUMN โดยการคัดลอกข้อมูลจากตารางเก่าไปยังตารางใหม่อย่างสมบูรณ์ (ทดสอบ MyISAM, เครื่องมือ InnoDB) ซึ่งสามารถติดตั้งฐานข้อมูลการทำงานที่มีบันทึกนับพันล้านรายการเป็นเวลาหลายวันหรือหลายสัปดาห์ก็ได้

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


ดังนั้น เมื่อพูดถึงการจัดเก็บอ็อบเจ็กต์ที่มีคุณสมบัติเสริมจำนวนมาก globals จึงเป็นตัวเลือกที่ยอดเยี่ยม

นอกจากนี้ ฉันขอเตือนคุณว่าการเข้าถึงคุณสมบัติใด ๆ นั้นเกิดขึ้นได้ทันที เนื่องจากในระดับโลกทุกเส้นทางนั้นเป็น B-tree

โดยทั่วไปฐานข้อมูลทั่วโลกเป็นฐานข้อมูลประเภทเอกสารที่มีความสามารถในการจัดเก็บข้อมูลแบบลำดับชั้น ดังนั้นฐานข้อมูลเชิงเอกสารจึงสามารถแข่งขันกับระดับโลกในด้านการจัดเก็บเวชระเบียนได้ แต่มันก็ยังไม่เหมือนกันซะทีเดียวลองใช้ MongoDB มาเปรียบเทียบกัน ในโดเมนนี้ มันแพ้ระดับโลกด้วยเหตุผลดังต่อไปนี้:

  1. ขนาดเอกสาร หน่วยจัดเก็บข้อมูลเป็นข้อความในรูปแบบ JSON (BSON ที่แม่นยำยิ่งขึ้น) โดยมีปริมาณสูงสุดประมาณ 16MB ข้อจำกัดนี้จัดทำขึ้นเป็นพิเศษเพื่อให้ฐานข้อมูล JSON ไม่ช้าลงในระหว่างการแยกวิเคราะห์ หากมีการจัดเก็บเอกสาร JSON ขนาดใหญ่ไว้ในฐานข้อมูล จากนั้นจึงเข้าถึงได้โดยช่องต่างๆ เอกสารนี้ควรมีข้อมูลทั้งหมดเกี่ยวกับผู้ป่วย เราทุกคนรู้ดีว่าบันทึกของผู้ป่วยมีความหนาเพียงใด ขนาดการ์ดสูงสุด 16MB ยุติทันทีสำหรับผู้ป่วยที่มีการ์ดโรคซึ่งรวมถึงไฟล์ MRI, การสแกน X-ray และการศึกษาอื่น ๆ ในสาขาหนึ่งของโลก คุณสามารถมีข้อมูลได้หลายกิกะไบต์และเทราไบต์ โดยหลักการแล้วเราสามารถยุติเรื่องนี้ได้ แต่ฉันจะทำต่อไป
  2. เวลาที่รู้สึกตัว/เปลี่ยนแปลง/ลบคุณสมบัติใหม่ในแผนภูมิของผู้ป่วย ฐานข้อมูลดังกล่าวจะต้องอ่านแผนที่ทั้งหมดลงในหน่วยความจำ (ซึ่งมีจำนวนมาก!) แยกวิเคราะห์ BSON เพิ่ม/เปลี่ยนแปลง/ลบโหนดใหม่ อัปเดตดัชนี แพ็กลงใน BSON และบันทึกลงในดิสก์ โกลบอลจำเป็นต้องเข้าถึงคุณสมบัติเฉพาะและจัดการมันเท่านั้น
  3. เข้าถึงคุณสมบัติแต่ละรายการได้อย่างรวดเร็ว ด้วยคุณสมบัติมากมายในเอกสารและโครงสร้างหลายระดับ การเข้าถึงคุณสมบัติแต่ละรายการจะเร็วขึ้น เนื่องจากแต่ละเส้นทางในระดับโลกนั้นเป็น B-tree ใน BSON คุณต้องแยกวิเคราะห์เอกสารเชิงเส้นเพื่อค้นหาคุณสมบัติที่ต้องการ

3.3.2 อาร์เรย์แบบเชื่อมโยง

อาร์เรย์แบบเชื่อมโยง (ถึงแม้จะมีอาร์เรย์ที่ซ้อนกัน) เข้ากันได้อย่างลงตัวกับโกลบอล ตัวอย่างเช่น อาร์เรย์จาก PHP จะแสดงในรูปแรก 3.3.1

$a = array(
  "name" => "Vince Medvedev",
  "city" => "Moscow",
  "threatments" => array(
    "surgeries" => array("apedicectomy", "biopsy"),
    "radiation" => array("gamma", "x-rays"),
    "physiotherapy" => array("knee", "shoulder")
  )
);

3.3.3 เอกสารลำดับชั้น: XML, JSON

จัดเก็บได้อย่างง่ายดายใน globals สามารถจัดวางจัดเก็บได้หลากหลายรูปแบบ

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

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2

<note id=5>
<to>Вася</to>
<from>Света</from>
<heading>Напоминание</heading>
<body>Позвони мне завтра!</body>
</note>

บน COS สิ่งนี้จะสอดคล้องกับรหัส:

Set ^xml("note")="id=5"
Set ^xml("note","to")="Саша"
Set ^xml("note","from")="Света"
Set ^xml("note","heading")="Напоминание"
Set ^xml("note","body")="Позвони мне завтра!"

หมายเหตุ: สำหรับ XML, JSON, อาร์เรย์ที่เชื่อมโยง คุณสามารถสร้างวิธีการแสดงบน Globals ได้หลายวิธี ในกรณีนี้ เราไม่ได้แสดงลำดับของแท็กย่อยในแท็กบันทึกย่อ ทั่วโลก ^xml แท็กย่อยจะแสดงตามลำดับตัวอักษร เพื่อสะท้อนถึงลำดับอย่างเคร่งครัด คุณสามารถใช้ เช่น จอแสดงผลต่อไปนี้:

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2
เจสัน
รูปภาพแรกจากส่วนที่ 3.3.1 แสดงให้เห็นภาพสะท้อนของเอกสาร JSON นี้:

var document = {
  "name": "Vince Medvedev",
  "city": "Moscow",
  "threatments": {
    "surgeries": ["apedicectomy", "biopsy"],
    "radiation": ["gamma", "x-rays"],
    "physiotherapy": ["knee", "shoulder"]
  },
};

3.3.4 โครงสร้างที่เหมือนกันซึ่งเชื่อมโยงกันด้วยความสัมพันธ์แบบลำดับชั้น

ตัวอย่าง: โครงสร้างสำนักงานขาย, ตำแหน่งของบุคคลในโครงสร้าง MLM, ฐานข้อมูลช่องเปิดในหมากรุก

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

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2

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

Globals เป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล ต้นไม้. ส่วนที่ 2

4. การใช้ globals มีประโยชน์มากที่สุดในกรณีใด?

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

ความเร็ว
ความง่ายในการประมวลผล/การนำเสนอข้อมูล

  1. การแทรก [ด้วยการเรียงลำดับอัตโนมัติในแต่ละระดับ], [การจัดทำดัชนีตามคีย์หลัก]
  2. การลบทรีย่อย
  3. ออบเจ็กต์ที่มีคุณสมบัติซ้อนกันจำนวนมากซึ่งต้องมีการเข้าถึงเป็นรายบุคคล
  4. โครงสร้างแบบลำดับชั้นที่มีความสามารถในการข้ามสาขาย่อยจากสาขาใดๆ แม้แต่สาขาที่ไม่มีอยู่จริงก็ตาม
  5. การสำรวจความลึกครั้งแรกของทรีย่อย
  1. ออบเจ็กต์/เอนทิตีที่มีคุณสมบัติ/เอนทิตีเสริม [และ/หรือซ้อน] จำนวนมาก
  2. ข้อมูลแบบไม่มีสคีมา เมื่อคุณสมบัติใหม่มักปรากฏขึ้นและเก่าหายไป
  3. คุณต้องสร้างฐานข้อมูลที่กำหนดเอง
  4. ฐานเส้นทางและแผนผังการตัดสินใจ เมื่อสะดวกจะแสดงเส้นทางเป็นต้นไม้
  5. การลบโครงสร้างลำดับชั้นโดยไม่ใช้การเรียกซ้ำ

นามสกุล “โลกเป็นดาบสมบัติสำหรับการจัดเก็บข้อมูล อาร์เรย์กระจัดกระจาย ตอนที่ 3".

ข้อจำกัดความรับผิดชอบ: บทความนี้และความคิดเห็นของฉันเป็นความคิดเห็นของฉัน และไม่เกี่ยวข้องกับตำแหน่งอย่างเป็นทางการของ InterSystems Corporation

ที่มา: will.com

เพิ่มความคิดเห็น