Проектирование баз данных для обмена сообщениями в Facebook

Давайте определим «объект» в Javascript . Согласно документам MDN , каждое значение является либо объектом, либо примитивом:

примитив, примитивное значение

Данные, которые не являются объектом и выполняют нет никаких методов. У JavaScript есть 5 примитивных типов данных: строка, число, логическое значение, ноль, неопределенный.

Что такое примитив?

  • 3
  • 'abc'
  • true
  • null
  • undefined

Что такое объект (то есть не примитив)?

  • Object.prototype
  • все происходит от Object.prototype
    • Function.prototype
      • Object li>
      • Function li>
      • function C(){} - пользовательские функции li> ul>
      • C.prototype - свойство прототипа пользовательской функции: это , а не C прототип
        • new C() - «новая» - определяемая пользователем функция li> ul>
        • Math
        • Array.prototype
          • arrays li> ul>
          • {"a": 1, "b": 2} - объекты, созданные с использованием буквенной нотации
          • new Number(3) - обертки вокруг примитивов
          • ... многое другое ...
        • Object.create(null)
        • все происходит от Object.create(null)

        Как проверить, является ли значение объектом

        instanceof само по себе не сработает, потому что пропущено два случая:

        // oops:  isObject(Object.prototype) -> false
        // oops:  isObject(Object.create(null)) -> false
        function isObject(val) {
            return val instanceof Object; 
        }
        

        typeof x === 'object' не сработает из-за ложных срабатываний (null) и ложных отрицаний (функции):

        // oops: isObject(Object) -> false
        function isObject(val) {
            return (typeof val === 'object');
        }
        

        Object.prototype.toString.call не будет работать из-за ложных срабатываний для всех примитивов:

        > Object.prototype.toString.call(3)
        "[object Number]"
        
        > Object.prototype.toString.call(new Number(3))
        "[object Number]"
        

        Поэтому я использую:

        function isObject(val) {
            if (val === null) { return false;}
            return ( (typeof val === 'function') || (typeof val === 'object') );
        }
        

        @ Даан ответ также, кажется, работает:

        function isObject(obj) {
          return obj === Object(obj);
        }
        

        , потому что, согласно MDN-документам :

        Конструктор Object создает обертка объекта для данного значения. Если значение равно нулю или не определено, он создаст и вернет пустой объект, в противном случае он вернет объект типа, соответствующего данному значению. Если значение уже является объектом, оно вернет значение.


        Третий способ, который, кажется, работает (не уверен, что он равен 100%) - это использовать Object.getPrototypeOf, который выдает исключение , если его аргумент не является объектом:

        // these 5 examples throw exceptions
        Object.getPrototypeOf(null)
        Object.getPrototypeOf(undefined)
        Object.getPrototypeOf(3)
        Object.getPrototypeOf('abc')
        Object.getPrototypeOf(true)
        
        // these 5 examples don't throw exceptions
        Object.getPrototypeOf(Object)
        Object.getPrototypeOf(Object.prototype)
        Object.getPrototypeOf(Object.create(null))
        Object.getPrototypeOf([])
        Object.getPrototypeOf({})
        

5
задан 17 July 2009 в 04:22
поделиться

3 ответа

Вот кое-что, что может оказаться полезным для начала:

Начните с двух таблиц, одна из которых будет содержать фактическое сообщение, а другая будет использоваться для отслеживания взаимосвязи между сообщениями.

Это может быть что-то вроде этого:

private_messages tbl:
id
date_sent
title
content
status ENUM ('unread', 'read') DEFAULT 'unread'

private_message_relation tbl:
id
message_id
sender_id
receiver_id

Затем вы можете добавить ограничения к идентификаторам отношения tbl в целях целостности данных.

4
ответ дан 14 December 2019 в 08:57
поделиться

Я считаю, что Facebook использует полностью настраиваемую систему, которая вообще не использует традиционную «базу данных». Тем не менее, этот парень реконструировал то, как будет выглядеть схема: http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Оказывается, они используют нечто, называемое Касандра . Вы также можете перейти непосредственно к проекту кода Google (для меня ссылка недоступна). Суть в том, что они используют что-то вроде Google BigTable, а не MySQL.

РЕДАКТИРОВАТЬ: См. Сообщение Джоша Смита выше для исправления этого сообщения.

0
ответ дан 14 December 2019 в 08:57
поделиться

В качестве исправления к комментарию Джо Facebook использует Кассандру для поиска по входящим, а не для обмена сообщениями. И этот «обратный инжиниринг» относится к классам объектов платформы Facebook, что, как мне кажется, не дает очень репрезентативного взгляда на структуру базы данных.

3
ответ дан 14 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: