Я новичок в базах данных и никогда не работал ни с одной СУБД. Однако я получаю основную идею о реляционных базах данных. По крайней мере, я так думаю; -)
Допустим, у меня есть пользовательская база данных со следующими свойствами для каждого пользователя:
В реляционной базе данных Я бы, например, смоделировал ее в таблице с именем user
и иметь второй стол с именем location
И location_id
- это внешний ключ (ссылка) на запись в таблице location
. Если я правильно понимаю, преимущество здесь, если почтовый индекс для определенного города меняется, мне нужно изменить только одну запись.
Итак, давайте перейдем к нереляционной базе данных , где я начал играть с Google App Engine. Здесь я действительно смоделировал бы это, как это было сначала записано в спецификациях. У меня есть вид user
:
class User(db.Model):
name = db.StringProperty()
zip = db.StringProperty()
city = db.StringProperty()
Преимущество состоит в том, что мне не нужно объединять две «таблицы», но недостатком является то, что, если почтовый индекс изменяется, мне нужно запустить скрипт, который просматривает все записи пользователя и обновляет почтовый индекс, правильно?
Итак, теперь в Google App Engine есть еще одна опция, которая должна использовать ReferenceProperties
. Я мог бы иметь два вида: user
и location
class Location(db.Model):
zip = db.StringProperty()
city = db.StringProperty()
class User(db.Model):
name = db.StringProperty()
location = db.ReferenceProperty(Location)
Если я не ошибаюсь, у меня теперь точно такая же модель, как в описанной выше реляционной базе данных. Что меня сейчас интересует, так это, прежде всего, то, что я только что сделал неправильно, и это разрушает все преимущества нереляционной базы данных. Я понимаю, что для получения значения zip и города мне нужно выполнить второй запрос. Но в другом случае, чтобы внести изменения в почтовый индекс, мне нужно пройти через всех существующих пользователей.
Итак, каковы последствия этих двух возможностей моделирования в нереляционной базе данных, такой как хранилище данных Google. И каковы типичные случаи использования для них обоих, то есть когда я должен использовать один, а когда другой.
Также в качестве дополнительного вопроса, если в нереляционной базе данных я могу моделировать точно так же, как и в реляционной базе данных, зачем вообще использовать реляционную базу данных?
Извините, если некоторые из этих вопросов звучат наивно, но я уверен, что они помогут паре людей, которые являются новичками в системах баз данных, получить лучшее понимание.