Я новичок в базах данных, и я никогда не работал с какой-либо СУБД. Однако я получаю основную идею реляционных баз данных. По крайней мере, я думаю, что я делаю: -)
Скажем, у меня есть пользовательская база данных со следующими свойствами для каждого пользователя:
- пользователь
- ID
- имя
- молния
- город
В реляционной базе данных я бы, например, смоделировал ее в таблице с именем user
- пользователь
- ID
- имя
- LOCATION_ID
и иметь вторую таблицу под названием location
- место
- ID
- молния
- город
И location_id
- это внешний ключ (ссылка) к записи в таблице location
. Если я правильно понимаю, преимущество здесь, если почтовый индекс для определенного города меняется, мне нужно изменить только одну запись.
Итак, перейдите в нереляционную базу данных, где я начал играть с Google App Engine. Здесь я бы действительно моделировал его, как он был записан первым в спецификации. У меня есть вид user
:
class User(db.Model):
name = db.StringProperty()
zip = db.StringProperty()
city = db.StringProperty()
Преимущество состоит в том, что мне не нужно присоединяться к двум "таблицам", но недостатком является то, что при изменении zip-кода я должен запустить script, который проходит через все пользовательские записи и обновляет почтовый индекс, правильно?
Итак, теперь есть еще один вариант в 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 и city, я должен запустить второй запрос. Но в другом случае, чтобы внести изменения в почтовый индекс, я должен запускать всех существующих пользователей.
Итак, каковы последствия этих двух возможностей моделирования в нереляционной базе данных, например в хранилище данных Google. И каковы типичные варианты использования для обоих из них, то есть когда я должен использовать один и другой.
Также как дополнительный вопрос, если в базе данных без отношения я могу моделировать точно то же самое, что я могу моделировать в реляционной базе данных, почему я должен использовать реляционную базу данных вообще?
Извините, если некоторые из этих вопросов звучат наивно, но я уверен, что они помогут пару людей, которые новичок в системах баз данных, чтобы лучше понять.