Должны ли НЕОБЯЗАТЕЛЬНЫЕ пользовательские настройки быть Lazy-Initialized в БД или всегда создаваться с новой регистрацией? - PullRequest
0 голосов
/ 07 октября 2011

Простой вопрос: Должны ли ДОПОЛНИТЕЛЬНЫЕ пользовательские настройки быть Lazy-Initialized в БД или всегда создаваться с новой регистрацией?

Пользователь может устанавливать дополнительные настройки, которые являются необязательными, поэтому должна быть строка для этой необязательной настройкисозданный для каждого пользователя при регистрации или созданный только тогда, когда пользователь впервые использует эти настройки?

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

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

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

1 голос
/ 10 ноября 2011

Вот один конкретный недостаток, с которым я столкнулся при использовании отложенной инициализации в MySQL.Все сводится к этой цитате из MySQL docs :

Пользовательские переменные зависят от соединения.

Первое: настройка

Подключитесь к вашей БД (в моем случае MySQL) Затем создайте простую функцию SetBarProperty () , которая устанавливает свойство @ bar ИСКЛЮЧИТЕЛЬНО длязначение передается в функцию.Сама функция просто возвращает переданное ей значение.

$ mysql
mysql> DROP FUNCTION IF EXISTS SetBarProperty;
Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER $$
mysql> CREATE FUNCTION SetBarProperty( myValue INT(30) )
    -> RETURNS INT(30)
    -> DETERMINISTIC
    -> READS SQL DATA
    -> BEGIN
    ->     SET @bar := myValue;
    ->     RETURN myValue;
    -> END $$
Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER ;

Теперь, если мы запросим свойство @ bar , оно будет NULL , как и ожидалось.

mysql> SELECT @bar;
+------+
| @bar |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

Опять же, если мы вызовем SetBarProperty (3); результат будет таким, как ожидалось.

mysql> SELECT SetBarProperty(3);
+-------------------+
| SetBarProperty(3) |
+-------------------+
|                 3 |
+-------------------+
1 row in set (0.00 sec)

Как вы думаете?

Как вы думаете, что произойдет, если мы вызовем следующий запрос?

SELECT SetBarProperty(4), @bar;

Вы угадали! @ bar - это 4 .

mysql> SELECT SetBarProperty(4), @bar;
+-------------------+------+
| SetBarProperty(4) | @bar |
+-------------------+------+
|                 4 |    4 |
+-------------------+------+
1 row in set (0.00 sec)

А теперь сложная часть ...

Отключение от сервера БД (это очень важно):

Ctrl+C

Теперь заново подключитесь и вызовите тот же запрос, что и раньше:

$ mysql
mysql> SELECT SetBarProperty(4), @bar;
+-------------------+------+
| SetBarProperty(4) | @bar |
+-------------------+------+
|                 4 | NULL |
+-------------------+------+
1 row in set (0.00 sec)

Вы видели, что только что произошло?

@bar был NULL , и это потому, что он не был инициализирован в пространстве вызывающей функции SetBarProperty () .

Если вы отключились от своегоDB и явно инициализировать свойство ДО вызова функции (которая сама инициализирует ее явность), ваш запрос работает так, как ожидалось:

Ctrl+C
$ mysql
mysql> SET @bar := NULL;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT SetBarProperty(4), @bar;
+-------------------+------+
| SetBarProperty(4) | @bar |
+-------------------+------+
|                 4 | 4    |
+-------------------+------+
1     row in set (0.00 sec)

Рекомендация

Если вы сразу используете свойство в запросе, простопосле того, как вы вызвали функцию, которая изменяет то же свойство, вы должны инициализировать свойство перед вызовом функции.

Надеюсь, это поможет!

С уважением,

Конрад

...