Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
Help will always be given at Hogwarts to those who ask for it.
On 04/29/2010 03:46 PM, _FRED_ wrote: > Существуют ли ситуации, когда в реляционной базе данных было бы > оправдано (с точки зрения нормального дизайна, а не кривых требований > :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, > первичным ключём?
С точки зрения нормального дизайна, я думаю, что не существует.
Скорее всего требовалось обеспечить генерацию уникальных
идентификаторов. В постгриз для этого есть sequense. В других базах тоже
бывает что-то такое.
Так вот при совпадении таких условий появление таблицы может быть
следстивем реализации.
— Необходимы уникальные значения для разных клиентов.
— Идентификаторы обязательно назначает база данных.
— использовать транзакции нельзя.
— в базе данных нет поддержки для генерации последовательностей
уникальных значений.
Вот в этих условиях может появиться такая таблица. Очевидно, что это
"кривые требования" а не "нормальный дизайн".
Вообще, таблица с одним полем — вполне нормальная ситуация.
Обычно такие таблицы определяют предметную область.
Примерами могут быть:
— список кодов штатов (NY, NJ, TX и т.д.)
— блеклист email адресов
— список ключевых слов
— список допустимых доменных зон
— список простых чисел (чтобы быстро проверить является ли большое число простым)
С точки зрения реляционной алгебры такая таблица является унарным отношением, обозначающим что что-то существует, т.е. например что существует такой штат или такая доменная зона.
Значения такого поля должны быть первичными ключами.
Но в вопросе именно автоинкрементный целый первичный ключ — и конкретно для него я не смог придумать оправданную с точки зрения нормального дизайна ситуацию, и не припомню чтобы я когда-то видел такую ситуацию или такую таблицу.
Здравствуйте, _FRED_, Вы писали:
_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
Здравствуйте, _FRED_, Вы писали:
_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:
Здравствуйте, _FRED_, Вы писали:
_FR>Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:
_FR>
По-моему, таблица Attributes никакого логического смысла не несет и демонстрирует только денормализацию БД. По крайней мере я пока не могу понять, зачем ссылаться на абстрактное число, которое даже не содержит описания. Или вы таким образом пытаетесь таблички в своей БД пронумеровать?
Здравствуйте, sunsquirel, Вы писали:
_FR>>Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:
S>По-моему, таблица Attributes никакого логического смысла не несет и демонстрирует только денормализацию БД. По крайней мере я пока не могу понять, зачем ссылаться на абстрактное число, которое даже не содержит описания. Или вы таким образом пытаетесь таблички в своей БД пронумеровать?
Есть предложение, как по-другому сослаться из Table1 и Table2 на множества записей таблицы Attribute? А если, например, я введу поле Attributes: { Id, DummyName, } всё станет нормально? Нет? А почему?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов.
Давай еще подробнее. Какие объекты предметной области (какой?) моделируют эти таблицы? Что такое "список атрибутов", сколько их всего возможно.
Здравствуйте, _FRED_, Вы писали:
_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
реестр объектов с операциями регистрация/удаление и существует/несуществует
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
On 04/29/2010 04:53 PM, _FRED_ wrote: > Здравствуйте, _FRED_, Вы писали: > > _FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём? > > Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот: > >
> > Так вот я и призадумался — нету ли какого другого решения или, возможно, вполне нормально наличие теблицы Attributes с одним единственным полем? > > ЗЫ: перенос Attributes1Id..AttributesNId из Table2 в отдельную таблицу обсуждать тут не хочу: "не сыпьте соль на рану"
Что-то страшное вы описываете.
Как понимать выражение "таблица ссылается на список атрибутов"???
Если уж нужно привязать именно к таблице какой-то набор данных
(атрибутов), используйте полное имя таблицы в качестве "внешнего ключа"
(в кавычках, потому что "это" не является внешним ключом).
Вот пример первые три таблицы определяют атрибуты и наборы атрибутов
(многие-ко-многим), последняя таблица связь Имя Таблицы и Наборы
Атрибутов (тоже многие-ко-многим).
On 04/29/2010 08:02 PM, Other Sam wrote: > Что-то страшное вы описываете.
Забыл сказать...
Информация о структуре таблицы, о ее назначении... вообще обо всем что
связанно с таблицей доступно во время разработки программы. Поэтому
"список атрибутов для таблицы" — это что-то УЖАСНОЕ!!! Это 100% ошибка в
понимании задачи.
У таблицы могут быть какие-то "атрибуты", но они должны быть такими,
чтобы можно было записать их на листочек и повешать на стену в офисе. И
не должно возникнуть необходимости заносить их в саму базу данных.
Здравствуйте, Other Sam, Вы писали:
OS>"список атрибутов для таблицы" — это что-то УЖАСНОЕ!!! Это 100% ошибка в OS>понимании задачи. OS>... OS>не должно возникнуть необходимости заносить их в саму базу данных.
Ты еще не сталкивался с большими тиражируемыми системами-конструкторами?
Цель — шарить один и тот пресет между несколькими сущностями, так? Других вариантов что-то не вижу.
Можно в табличке Attributes (я бы обозвал как AttributeSets или AttributePresets) добавить кучу булевых полей (ReferrableByTable1, ReferrableByTable2...) — для сценариев "пресет такой-то может быть назначен таблице такой-то и другой-то". Хоть какая-то польза будет.
Будут грабли с неочевидными зависимостями — помним "и я подумал — а зачем мне два диска c:?" Может, можно обойтись без шаринга?
P.S. Если атрибутов мало, можно извратиться — назначаем каждому атрибуту ID = степени двойки, храним в ссылающемся поле bitmask — вуаля
P.P.S. Если пресеты важны как самостоятельные сущности, изврат ничем не поможет, зато вынесет мозг саппорту.
Здравствуйте, Other Sam, Вы писали:
OS>Вот пример первые три таблицы определяют атрибуты и наборы атрибутов OS>(многие-ко-многим), последняя таблица связь Имя Таблицы и Наборы OS>Атрибутов (тоже многие-ко-многим).
В оригинальной постановке задачи Attribute_to_Set явно лишний — каждый атрибут входит строго в одни набор. У наборов нет SetData
OS>Что-то страшное вы описываете.
Так вы описали практически то же самое.
*подозрительно: доктор, а откуда у вас такие картинки?
** EAVом попахивает.
On 04/29/2010 08:15 PM, wildwind wrote: > OS>"список атрибутов для таблицы" — это что-то УЖАСНОЕ!!! Это 100% ошибка в > OS>понимании задачи. > OS>... > OS>не должно возникнуть необходимости заносить их в саму базу данных. > > Ты еще не сталкивался с большими тиражируемыми системами-конструкторами?
Если необходимо чтобы в системе было неизвестное кол-во таблиц с
неизвестными столбцами и неизвестными "атрибутами", то в реляционной
базе так и нужно сделать.
CREATE TABLE MyAppTables();
CREATE TABLE MyAppColumns();
CREATE TABLE MyAppTableAttributes();
CREATE TABLE MyAppTableAttributeSets();
-- и еще таблицы связей
Вот и все. Структура базы данных в процессе эксплуатации не изменяется.
_FRED_ пишет:
> Существуют ли ситуации, когда в реляционной базе данных было бы > оправдано (с точки зрения нормального дизайна, а не кривых требований > :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, > первичным ключём?
Нет. У такой таблицы нет атрибутов, только первичный ключ. Значит, нет данных.
Таблица бесполезна.
Здравствуйте, _FRED_, Вы писали:
_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
Существуют. Например, реализация наследования в базе.
Пример: базовый класс: действующее лицо системы (живёт в таблице с одной автоинкрементной колонкой)
Дочерние классы: поставщик (таблица "поставщик", ссылается на действующее лицо),потребитель (таблица "потребитель", ссылается на действующее лицо), менеджер (таблица "менеджер ", ссылается на действующее лицо) и так далее.
Имея такую структуру, мы можем легко и однотипно обрабатывать все сущности. Например, добавить таблицу "адрес", ссылающуюся на "действующее лицо".
Пример не выдуманный, отлично жил в работающей системе.
Здравствуйте, vmpire, Вы писали:
V>Существуют. Например, реализация наследования в базе.
Я тут покритикую чуть-чуть. Без деталей тяжело судить предметно, но решение кажется надуманным. Единственное общее между всеми лицами в вашем изложении — это то, что все они — люди. Правда, непонятно как быть, если появятся юридические. С таблицей IndividualsOrIncorporatedPersons выйдет ровно то же, что и с набором атрибутов — общих полей у них нет. Можно конечно завести в ссылающихся таблицах два внешних ключа с чеком, что один их них null — выглядит так же криво.
А самая тоска — когда содержимое таблиц зависит от типа лица. Редко, но бывает.
V>Имея такую структуру, мы можем легко и однотипно обрабатывать все сущности. Например, добавить таблицу "адрес", ссылающуюся на "действующее лицо".
Чего-чего? Адреса вообще-то существуют сами по себе. Может, вы про табличку "ID лица/ID адреса/тип адреса"? Так её обычно денормализуют или разбивают на несколько.
Юр. и физлица — вообще идеальный пример влияния дырявых абстрацкий на дизайн.
Здравствуйте, vmpire, Вы писали:
_FR>>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём? V>Существуют. Например, реализация наследования в базе. V>Пример не выдуманный, отлично жил в работающей системе.
Если он жил именно в таком минимальном варианте — одно поле в базовой таблице объектов, то вам есть еще куда расти
-- Пользователи не приняли программу. Всех пришлось уничтожить. --