дизайн базы данных: проблема с обновлением таблицы - PullRequest
1 голос
/ 01 сентября 2011

У меня проблема с проектированием таблиц БД.Для объяснения моей проблемы здесь есть простой форум БД.таблица форума содержит следующие столбцы:

|  forum_id  |    title      |     desc     |   last_update    |
------------------------------------------------------------
|      1     |    'title'    |    'desc'    |    2011/5/3      |

теперь, когда я создаю эту таблицу, я должен разрешать нулевые значения для столбцов title, desc и last_update или нет ??

, если я логически думаю,форум всегда должен иметь значение для столбцов title и desc, в то время как столбец last_update может быть нулевым или не нулевым, но если пользователь пытается обновить столбец title, он / она должен также предоставить значение desc.так что это нехорошо, так как при таком подходе мы должны найти значение desc форума, который мы редактируем, и снова передать его в оператор sql, что приведет к ненужной перезаписи значения, которое уже существует!

проблема 1: с другой стороны, если я объявляю отдельные sps для каждого из операторов обновления (по одному для каждого обновления столбца) и моя таблица достаточно велика, то это приводит к тому, что база данных переполняется sps, которые в основном делают то же самое ната же таблица.

проблема 2: если я разрешу нулевые значения, то подобное обновление нарушит целостность моих данных:

update ForumDB(title, desc, last_update) 
values ('edited title', null, 2011/6/4)
where forum_id = 1

, что можно сделать, чтобы предотвратить оба этих побочных эффекта??

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

База данных предназначена для хранения данных, это единственная цель базы данных (и отнюдь не маленькая задача).И данные являются одной из самых (если не самых) важных частей вашего приложения.

Таким образом, вы делаете что-то ( что-нибудь ), которое не нарушит целостностьваших данных.

То, как вы получаете доступ, как вы обновляете, относительно менее важно, чем целостность данных.Они всегда могут быть оптимизированы.Вы не можете поставить под угрозу целостность данных.(Если вы хотите получить некоторые указания о том, как оптимизировать, вы должны указать технологию, которую вы используете, и подход, которым вы придерживаетесь / планируете следовать)

Итак: вы не разрешаете нулевые значения для titleи столбцы desc.

Проблема 2 на самом деле не является проблемой вообще: размер хранимой процедуры (если вы именно это подразумевали под SP) для обновления базы данных не зависит отобъем данных.Даже если у вас огромная таблица, у вас все еще есть только одна (или куча) хранимых процедур для манипулирования данными.

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

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

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

Но почему?

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

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

3 голосов
/ 01 сентября 2011

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

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

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

SET title = COALESCE(@title, title), 
    Desc= COALESCE(@Desc,Desc)

Вам необходимо проверить,Существуют какие-либо последствия для производительности этих не обновляющихся обновлений в вашей РСУБД. Для SQL Server некоторую информацию об этом можно найти здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...