השוואה סובייקטיבית לגמרי בין neo4j ל datomic

29/04/2023

השבוע התבשרנו שדטומיק, או יותר נכון nubank, החברה שמחזיקה ב datomic, החליטו לבטל את כל עסקי הרישיון המסחרי של דטומיק ולהפיץ גם את גירסת הפרו בחינם. כדי לחגוג את האירוע הנה השוואה קצרה וסובייקטיבית לגמרי שלי בין שני בסיסי נתוניים גרפיים שאהבתי במיוחד - Datomic מול neo4j.

1. דטומיק

דטומיק הוא בסיס נתונים שכתוב ב Clojure ומקדש את עיקרון הפשטות. יש לו מבנה פשוט ואפשר בקלות לראות איך כל פעולה תתבצע בתוך מבנה זה. אלה עקרונות העבודה המרכזיים של דטומיק:

  1. המידע מאוחסן בתור Tuples של: "יישות", "מאפיין", "ערך", "מתי נקבע", "האם נמחק". כל בסיס הנתונים הוא פשוט אוסף של Tuples כאלה.

  2. כל תהליך שעובד מול בסיס הנתונים מקבל עותק מלא של בסיס הנתונים נכון לרגע מסוים.

  3. בסיס הנתונים עובד במתכונת "הוספה בלבד". שורה שנכתבה לעולם לא תימחק ותמיד אפשר להסתכל על נתונים היסטוריים.

  4. כל השאילתות והחיפושים (קריאות) מבוצעים בזיכרון של האפליקציה, שקיבלה עותק מלא של כל בסיס הנתונים נכון לרגע מסוים. לכן יצירת דוחות מורכבים לא מעמיסה על בסיס הנתונים.

  5. כתיבות מבוצעות רק מתהליך בסיס הנתונים עצמו, שפועל ב Single Thread ולכן אין כתיבה במקביל.

  6. בשביל טרנזאקציות אנחנו שותלים קוד בתוך תהליך הכתיבה לבסיס הנתונים. בגלל שהכתיבה היא תמיד סדרתית קוד שרץ בתוך התהליך שכותב תמיד ירוץ לבד.

דטומיק נכתב על ידי חברת Cognitect שהיא גם החברה שפיתחה את שפת Clojure. החברה בבעלות Nubank ולכן בסיס הנתונים מופץ בחינם לגמרי אבל אינו בקוד פתוח.

כתבתי על עבודה עם דטומיק כאן וכאן.

2. נאו פור ג'יי

בסיס הנתונים neo4j הוא בסיס הנתונים הגרפי בקוד פתוח הנפוץ בעולם. הוא כתוב ב Java ועובד הרבה יותר כמו בסיס נתונים מסורתי, רק שהמידע מאורגן בצמתים וקשתות. אלה מספר רעיונות מרכזיים לגביו:

  1. בסיס הנתונים רץ כתהליך נפרד והתקשורת איתו מבוצעת ב HTTP או בפרוטוקול בינארי שלהם שנקרא bolt.

  2. בסיס הנתונים מדבר במונחים גרפיים: יש צמתים וקשתות, אנחנו יכולים להגדיר מאפיינים על הצמתים או על הקשתות ואפשר להוסיף תוויות גם לצמתים וגם לקשתות. תוויות עוזרות לנו למצוא מידע בשאילתות.

  3. אפשר להפעיל את neo4j בקלאסטר והוא תומך ב Horizontal Scaling.

  4. אנחנו יכולים ליצור אינדקסים כדי לשפר ביצועים של שליפות, ויש תורה שלמה סביב ארגון המידע כדי שהשליפות יעבדו כמו שצריך.

כתבתי על שאילתות ב neo4j כאן.

3. השוואה סובייקטיבית לגמרי

אחרי עבודה גם עם neo4j וגם עם datomic בפרויקטים שונים, אלה הנקודות המרכזיות שאהבתי או לא אהבתי בכל אחד מהם:

  1. לכל בסיס נתונים שפת שאילתות משלו. ב neo4j זו Cypher וב datomic זו datalog. לי Cypher היתה קצת יותר קלה.

  2. אהבתי מאוד את ה Immutability של Datomic והעובדה שמידע נשמר לנצח. מימוש של זה ב Neo4j דורש עבודה בצד האפליקציה (כמו בבסיס נתונים רלציוני רגיל) ולכן ברוב המערכת לא נשקיע בזה, רק עבור מידע מאוד ספציפי שצריך להישמר לנצח.

  3. כלי העבודה למפתחים סביב Neo4j הרבה הרבה יותר נוחים ממה שיש בעולם של Datomic, ובנוסף התיעוד של neo4j והקורסים הקיימים אצלם באתר הופכים את הכניסה אליו להרבה יותר קלה בהשוואה לדטומיק.

  4. אומנם אפשר לתשאל את Datomic מכל שפת תכנות, אבל אנחנו מפסידים הרבה מהיתרונות שלו אם נעבוד מולו משפה שאינה ב JVM, כי רק שפות ב JVM מקבלות את כל העותק של בסיס הנתונים לזיכרון.

  5. ב neo4j אפשר לשמור מידע על הקשתות. ב Datomic צריך לבנות צומת שיחבר בין שני צמתים כי רק צמתים יכולים לשמור מידע.

שורה תחתונה - Datomic הוא בסיס נתונים הרבה יותר פשוט. הגישה שלהם שמידע רק מתווסף ושכל תוספת מידע מתועדת בלוג מסודר מאוד עוזרת כשצריך לזהות מה קרה או למה משהו קרה. לעומתו neo4j כולל שפת שאילתות הרבה יותר מתוחכמת שמאפשרת לשלב בין שינויים לשליפת מידע באותה שאילתה, מגיע עם כלי פיתוח הרבה יותר מתקדמים ופשוט הרבה יותר קל להבנה, התקנה ותחילת עבודה.

אם אתם מחפשים בסיס נתונים גרפי שניהם יתנו תוצאות טובות.

אלה מכם שכבר מגיעים מהעולם של Clojure או Java, או שצריכים את שמירת המידע הנצחית של דטומיק יהנו ממנו מאוד. אלה שמעדיפים התקנה קלה ובסיס נתונים פופולרי שפשוט עובד יהנו יותר מ neo4j.