Как думать в хранилищах данных вместо баз данных?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
182
задан Pat Myron 31 August 2018 в 19:47
поделиться

5 ответов

Существует два главного привыкнуть приблизительно к хранилищу данных Механизма Приложения когда по сравнению с 'традиционными' реляционными базами данных:

  • хранилище данных не делает различия между вставками и обновлениями. То, когда Вы называете помещенными () на объекте, тот объект хранится к хранилищу данных с его уникальным ключом и чем-либо, что имеет тот ключ, перезаписывается. В основном каждый вид объекта в хранилище данных действует как огромная карта или отсортированный список.
  • Запросы, как, на который Вы сослались, намного более ограничены. Никакие соединения, для запуска.

ключевая вещь понять - и причина позади обоих этих различий - состоит в том, что Bigtable в основном действует как огромный заказанный словарь. Таким образом помещенная операция просто устанавливает значение для данного ключа - независимо от любого предыдущего значения для того ключа, и операции выборки ограничены выборкой единственных ключей или непрерывных диапазонов ключей. Более сложные запросы сделаны возможными с индексами, которые являются в основном просто собственными таблицами, позволяя Вам реализовать более сложные запросы как сканирования на непрерывных диапазонах.

, Как только Вы поглотили это, Вам были нужны элементарные знания для понимания возможностей и ограничений хранилища данных. Ограничения, которые, возможно, казались произвольными, вероятно, имеют больше смысла.

ключевая вещь здесь состоит в том, что, хотя это ограничения по тому, что можно сделать в реляционной базе данных, эти те же ограничения - то, что делает ее практичной для увеличения масштаба к виду величины, которую Bigtable разработан для обработки. Вы просто не можете выполнить вид запроса, который выглядит хорошим на бумаге, но является ужасно медленным в базе данных SQL.

С точки зрения того, как измениться, как Вы представляете данные, самой важной вещью является предварительное вычисление. Вместо того, чтобы делать соединения во время запроса, предварительно вычислите данные и сохраните его в хранилище данных по мере возможности. Если Вы хотите выбрать случайную запись, генерировать случайное число и снабдить его каждой записью. <забастовка> Там является целой поваренной книгой подобных подсказок и обманывает здесь Редактирование: поваренная книга больше не является существующей.

148
ответ дан Nick Johnson 23 November 2019 в 06:07
поделиться

Путем я шел о переключателе ума, должен забыть о базе данных в целом.

В реляционном мире дб всегда необходимо волноваться о нормализации данных и структуре таблицы. Угробьте все это. Просто расположение Ваша веб-страница. Положите их всех. Теперь посмотрите на них. Вы уже 2/3 там.

, Если Вы забываете понятие, что вопросы размера базы данных и данные не должны быть дублированы тогда, Вы - 3/4 там, и Вы не должны были даже писать код! Позвольте своим представлениям продиктовать Ваши Модели. Вы не должны брать свои объекты и делать их 2 размерными больше как в реляционном мире. Можно хранить объекты с формой теперь.

Да, это - упрощенное объяснение испытания, но оно помогло мне забыть о базах данных и просто подать заявку. Я сделал 4 приложения для Механизма Приложения до сих пор с помощью этой философии и существует больше для прибытия.

41
ответ дан Matt Fenwick 23 November 2019 в 06:07
поделиться

Если Вы привыкли думать о ORM-отображенных объектах тогда, это в основном, как работает основанное на объекте хранилище данных как Механизм Приложения Google. Для чего-то как соединения можно посмотреть ссылочные свойства . Вы не должны действительно быть обеспокоены тем, использует ли это BigTable для бэкенда или чего-то еще, так как бэкенд абстрагирован API-интерфейсами Хранилища данных и GQL.

3
ответ дан Mark Cidade 23 November 2019 в 06:07
поделиться

Будучи базированным в мире базы данных, хранилище данных мне было бы гигантской таблицей (отсюда имя "bigtable"). BigTable является плохим примером, хотя, потому что он делает много других вещей, которые типичная база данных не могла бы сделать, и все же это - все еще база данных. Возможности состоят в том, если Вы не знаете, что необходимо создать что-то как "bigtable" Google, Вы, вероятно, согласитесь со стандартной базой данных. Им нужно это, потому что они обрабатывают безумные объемы данных и системы вместе, и никакая коммерчески доступная система не может действительно сделать задание точным путем, они могут продемонстрировать, что им нужно задание, которое будет сделано.

(bigtable ссылка: http://en.wikipedia.org/wiki/BigTable )

-6
ответ дан devinmoore 23 November 2019 в 06:07
поделиться

Я всегда хихикаю, когда люди выпускают - это не является реляционным. Я записал cellectr в django, и вот отрывок моей модели ниже. Как Вы будете видеть, у меня есть лиги, которыми управляют или тренируют пользователи. Я могу от лиги получать всех менеджеров, или от данного пользователя я могу возвратить лигу, которую она тренирует или менеджеры.

Просто, потому что нет никакой определенной поддержки внешнего ключа, не означает, что у Вас не может быть модели базы данных с отношениями.

Мои два пенса.


class League(BaseModel):
    name = db.StringProperty()    
    managers = db.ListProperty(db.Key) #all the users who can view/edit this league
    coaches = db.ListProperty(db.Key) #all the users who are able to view this league

    def get_managers(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.managers)

    def get_coaches(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.coaches)      

    def __str__(self):
        return self.name

    # Need to delete all the associated games, teams and players
    def delete(self):
        for player in self.leagues_players:
            player.delete()
        for game in self.leagues_games:
            game.delete()
        for team in self.leagues_teams:
            team.delete()            
        super(League, self).delete()

class UserPrefs(db.Model):
    user = db.UserProperty()
    league_ref = db.ReferenceProperty(reference_class=League,
                            collection_name='users') #league the users are managing

    def __str__(self):
        return self.user.nickname

    # many-to-many relationship, a user can coach many leagues, a league can be
    # coached by many users
    @property
    def managing(self):
        return League.gql('WHERE managers = :1', self.key())

    @property
    def coaching(self):
        return League.gql('WHERE coaches = :1', self.key())

    # remove all references to me when I'm deleted
    def delete(self):
        for manager in self.managing:
            manager.managers.remove(self.key())
            manager.put()
        for coach in self.managing:
            coach.coaches.remove(self.key())
            coaches.put()            
        super(UserPrefs, self).delete()    
23
ответ дан 2 revs, 2 users 76%Phil Stollery 23 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

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