metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-12-11 08:10 pm

Rule of thumb

Если в стандарте, документации или технологии упоминаются гуиды или в структурах присутствуют поля вида object_id, class_id, instance_id - с 99% вероятностью это будет дичайше непригодное к использованию ИТ-шайзе, придуманное людьми, которые не умеют делать нормальные API (или, что почти эквивалентно - не понимают, что такое системы типов) и вместо того чтобы подумать - делают "универсальное решение".

[identity profile] sbj-ss.livejournal.com 2014-12-11 05:12 pm (UTC)(link)
А как объекты идентифицировать прикажешь? :)

[identity profile] metaclass.livejournal.com 2014-12-11 05:20 pm (UTC)(link)
well-known объекты (классы или поля в структурах, например) - по именам, возможно с неймспейсами.

остальным объектам (инстансам) можно что угодно - гуиды, автоинкременты, если объекты не постоянные - то вообще можно не идентифицировать.


[identity profile] sbj-ss.livejournal.com 2014-12-11 05:21 pm (UTC)(link)
То есть гуиды и поля object_id/instance_id таки допустимы? :)

[identity profile] aamonster.livejournal.com 2014-12-11 05:38 pm (UTC)(link)
Э... А как же всякая хрень в базах данных? Или имеется в виду, что все эти id живут под капотом и наружу не выпускаются, прячась при необходимости за непрозрачными обёртками?

[identity profile] metaclass.livejournal.com 2014-12-11 05:49 pm (UTC)(link)
В базах данных такое бывает, если делать EAV. Это иногда допустимо, когда надо хранить неприятные данные (графы из сложных объектов с кучей атрибутов, для CAD и прочего такого).

В других случаях лучше все именовать явно, кроме автоматически генерируемых идентификаторов объектов - те желательно числовыми, а гуиды - если очень хочется распределенные БД делать.


Я скорее про всякие кишки, вот как здесь: http://lwn.net/Articles/391230/

[identity profile] aamonster.livejournal.com 2014-12-11 06:05 pm (UTC)(link)
У меня неприятные воспоминания связаны с автоматически генерируемыми числовыми id (баг, когда они внезапно начали реюзаться после восстановления/чистки битой базы).

Но я с базами, вообще говоря, крайне мало дела имел. До такой степени, что не так давно реляционная алгебра (когда основная сущность - не строка таблицы, а множество) стала для меня откровением (я застрял в эпохе dBase II, где, насколько я помню, кроме таблиц и индексов практически ничего и не было - для задач уровня "показать Master-Detail" этого хватало).

Ну и да - я говорил именно про автоматически генерируемые id. Довольно нелепо спрашивать у клиента id, не выдав его предварительно.
Edited 2014-12-11 18:06 (UTC)

[identity profile] metaclass.livejournal.com 2014-12-11 06:17 pm (UTC)(link)
Как раз для случая "id генерится клиентом" - гуид вполне себе решение.

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

[identity profile] aamonster.livejournal.com 2014-12-11 06:26 pm (UTC)(link)
В такой-то формулировке кажется более-менее естественным и очевидным.

Хотя, если подумать - видится исключение: создание однородной структуры для well-known и user-generated хрени (ну там, у объекта есть цвет, форма и размер, а юзер может прихреначить ещё 100500 параметров). Это, как я понимаю, тот самый случай EAV.

[identity profile] tzirechnoy.livejournal.com 2014-12-11 06:30 pm (UTC)(link)
И как по-вашэму, у людей есть имена?

[identity profile] falcrum.livejournal.com 2014-12-11 07:33 pm (UTC)(link)
У некотрых ещё и отчество, и фамилия. Топикстартер предлагает это и хранить ключом, я так понимаю. Ну, там, ещё номер соцстрахования для уникальности дописать. А потом удивляться, чего это база пухнет и дохнет от таких индексных полей.

[identity profile] sbj-ss.livejournal.com 2014-12-11 09:05 pm (UTC)(link)
Можно ещё задаться вопросом "а откуда должен браться номер соцстрахования?"
И будет известная история про деньги и тумбочку.

[identity profile] w00dy.livejournal.com 2014-12-12 12:10 am (UTC)(link)
особенно забавно когда люди по религиозным причинам этот самый уникальный номер соцстрахования могут не иметь :)

[identity profile] juan-gandhi.livejournal.com 2014-12-11 08:08 pm (UTC)(link)
Ой. Имена людей - это пиздец проблема.

[identity profile] sbj-ss.livejournal.com 2014-12-11 06:32 pm (UTC)(link)
Это очень удобно в проекте одного человека, да и то если проект десять лет не мучить, периодически возвращаясь. А если взять тот же WMI по ссылке, то стопицот вендоров замаются искать свободные имена, потом будут "^^^### ACPI_0RK_88_YPOBH9| ###^^^".

[identity profile] juan-gandhi.livejournal.com 2014-12-11 08:06 pm (UTC)(link)
Строго - но справедливо. Буду руководствоваться указаниями. (Сам-то я с этими идами борюсь тоже как ненормальный).

[identity profile] vit-r.livejournal.com 2014-12-11 09:31 pm (UTC)(link)
Стандарты обычно пишут люди, далёкие от реальных задач.

Идентификаторы (гарантированно уникальные) нужны во многих случаях, если речь стоит о сшивке разных систем.

[identity profile] swamp-agr.livejournal.com 2014-12-12 05:39 am (UTC)(link)
Как правило, если совсем приспичило хранить instance_id, то можно обойтись первыми двумя полями, а "instance_id" хранить в виде object_id с class_id, соответствующим instance.
Метамодели наше всё.
Хотя если структура данных - метамодель, то до такого, как instance_id, уже не доходит.

[identity profile] 3c9nm.livejournal.com 2014-12-12 10:40 am (UTC)(link)
метаклас, как ни крути жопкой перед блогерами, все равно ты дебил.

[identity profile] metaclass.livejournal.com 2014-12-12 01:27 pm (UTC)(link)
Глазов, почему злые блоггеры требуют, чтобы я удалял твои комментарии?
Была б моя воля, я бы удалял только особо бредовую половину:)

[identity profile] veter-r-r.livejournal.com 2014-12-12 09:03 pm (UTC)(link)
И что прикажете делать ежели например надо получить баланс пользователя? По имени их дергать? так они, сволочи, совпадать могут.
Генерировать для них GUID? А чем это отличаться от id_user будет?

или вообще о чем пост?

[identity profile] maksenov.livejournal.com 2014-12-13 06:28 am (UTC)(link)
Таки вы совсем о другом - вот если бы вы имели кортеж (type_id, object_id, instance_id) чтобы однозначно идентифицировать пользователя - такой себе аналог EAV, тогда вас бы можно было остреливать. А если вы делаете искусственный первичный ключ для конкретного типа, число или гуид (в зависимости от задачи), то в этом нет ничего плохого.

Как вам подход использовать в качестве суррогатного первичного ключа первые 8 символов гуида строкой и концепцию "вставлять пока не вставится" ? Я очень долго дивился, когда это увидел.