Таблица с одним полем - быть или не быть?
От: _FRED_ Черногория
Дата: 29.04.10 08:46
Оценка:
Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
Help will always be given at Hogwarts to those who ask for it.
Re: Таблица с одним полем - быть или не быть?
От: Other Sam Россия  
Дата: 29.04.10 09:21
Оценка:
On 04/29/2010 03:46 PM, _FRED_ wrote:
> Существуют ли ситуации, когда в реляционной базе данных было бы
> оправдано (с точки зрения нормального дизайна, а не кривых требований
> :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым,
> первичным ключём?

С точки зрения нормального дизайна, я думаю, что не существует.
Скорее всего требовалось обеспечить генерацию уникальных
идентификаторов. В постгриз для этого есть sequense. В других базах тоже
бывает что-то такое.
Так вот при совпадении таких условий появление таблицы может быть
следстивем реализации.
— Необходимы уникальные значения для разных клиентов.
— Идентификаторы обязательно назначает база данных.
— использовать транзакции нельзя.
— в базе данных нет поддержки для генерации последовательностей
уникальных значений.
Вот в этих условиях может появиться такая таблица. Очевидно, что это
"кривые требования" а не "нормальный дизайн".
Posted via RSDN NNTP Server 2.1 beta
Re: Таблица с одним полем - быть или не быть?
От: MozgC США http://nightcoder.livejournal.com
Дата: 29.04.10 09:24
Оценка: 21 (5) +2
Вообще, таблица с одним полем — вполне нормальная ситуация.
Обычно такие таблицы определяют предметную область.
Примерами могут быть:
— список кодов штатов (NY, NJ, TX и т.д.)
— блеклист email адресов
— список ключевых слов
— список допустимых доменных зон
— список простых чисел (чтобы быстро проверить является ли большое число простым)

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

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

Вот такие вот размышления..
Re: Таблица с одним полем - быть или не быть?
От: Kalina9001  
Дата: 29.04.10 09:39
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?


Хм... Версия базы данных?
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re: Таблица с одним полем - быть или не быть?
От: _FRED_ Черногория
Дата: 29.04.10 09:53
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?


Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:

Attributes: { Id, }
Attribute: { Id, Name, ListId->Attributes, }
Table1 { Id, Name, AttributesId->Attributes, }
Table2 { Id, Name, Attributes1Id->Attributes, Attributes2Id->Attributes, Attributes3Id->Attributes, }


Так вот я и призадумался — нету ли какого другого решения или, возможно, вполне нормально наличие теблицы Attributes с одним единственным полем?

ЗЫ: перенос Attributes1Id..AttributesNId из Table2 в отдельную таблицу обсуждать тут не хочу: "не сыпьте соль на рану"
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Таблица с одним полем - быть или не быть?
От: sunsquirel США  
Дата: 29.04.10 10:44
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:


_FR>
_FR>Attributes: { Id, }
_FR>Attribute: { Id, Name, ListId->Attributes, }
_FR>Table1 { Id, Name, AttributesId->Attributes, }
_FR>Table2 { Id, Name, Attributes1Id->Attributes, Attributes2Id->Attributes, Attributes3Id->Attributes, }
_FR>


По-моему, таблица Attributes никакого логического смысла не несет и демонстрирует только денормализацию БД. По крайней мере я пока не могу понять, зачем ссылаться на абстрактное число, которое даже не содержит описания. Или вы таким образом пытаетесь таблички в своей БД пронумеровать?
Re[3]: Таблица с одним полем - быть или не быть?
От: _FRED_ Черногория
Дата: 29.04.10 10:58
Оценка:
Здравствуйте, sunsquirel, Вы писали:

_FR>>Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:


_FR>>Attributes: { Id, }
_FR>>Attribute: { Id, Name, ListId->Attributes, }
_FR>>Table1 { Id, Name, AttributesId->Attributes, }
_FR>>Table2 { Id, Name, Attributes1Id->Attributes, Attributes2Id->Attributes, Attributes3Id->Attributes, }


S>По-моему, таблица Attributes никакого логического смысла не несет и демонстрирует только денормализацию БД. По крайней мере я пока не могу понять, зачем ссылаться на абстрактное число, которое даже не содержит описания. Или вы таким образом пытаетесь таблички в своей БД пронумеровать?


Есть предложение, как по-другому сослаться из Table1 и Table2 на множества записей таблицы Attribute? А если, например, я введу поле Attributes: { Id, DummyName, } всё станет нормально? Нет? А почему?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Таблица с одним полем - быть или не быть?
От: wildwind Россия  
Дата: 29.04.10 12:42
Оценка: +2
Здравствуйте, _FRED_, Вы писали:

_FR>Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов.


Давай еще подробнее. Какие объекты предметной области (какой?) моделируют эти таблицы? Что такое "список атрибутов", сколько их всего возможно.
Re: Таблица с одним полем - быть или не быть?
От: ksg71 Германия  
Дата: 29.04.10 12:45
Оценка: 1 (1)
Здравствуйте, _FRED_, Вы писали:

_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?


реестр объектов с операциями регистрация/удаление и существует/несуществует
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[2]: Таблица с одним полем - быть или не быть?
От: Other Sam Россия  
Дата: 29.04.10 13:02
Оценка:
On 04/29/2010 04:53 PM, _FRED_ wrote:
> Здравствуйте, _FRED_, Вы писали:
>
> _FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?
>
> Ладно, попробую подробнее описать ситуацию. Есть такое понятие, как Attribute: { Id, Name }. Разным таблицам в БД требуется ссылаться на списки аттрибутов. Например, таблица Table1 должна иметь ссылку на список аттрибутов, а таблица Table2 — ссылку на три списка атрибутов. У меня придумалось это вот:
>
>
> Attributes: { Id, }
> Attribute: { Id, Name, ListId->Attributes, }
> Table1 { Id, Name, AttributesId->Attributes, }
> Table2 { Id, Name, Attributes1Id->Attributes, Attributes2Id->Attributes, Attributes3Id->Attributes, }
>

>
> Так вот я и призадумался — нету ли какого другого решения или, возможно, вполне нормально наличие теблицы Attributes с одним единственным полем?
>
> ЗЫ: перенос Attributes1Id..AttributesNId из Table2 в отдельную таблицу обсуждать тут не хочу: "не сыпьте соль на рану"

Что-то страшное вы описываете.

Как понимать выражение "таблица ссылается на список атрибутов"???

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

Вот пример первые три таблицы определяют атрибуты и наборы атрибутов
(многие-ко-многим), последняя таблица связь Имя Таблицы и Наборы
Атрибутов (тоже многие-ко-многим).

CREATE TABLE Attributes (
   AttributeID integer PRIMARY KEY,
   AttributeData text
);
CREATE TABLE AttributeSets (
   SetID integer PRIMARY KEY,
   SetData...
);
CREATE TABLE Attribute_to_Set (
   AttibuteID integer NOT NULL,
   SetID integer NOT NULL,
   PRIMARY KEY (AttributeID, SetID)
);
CREATE TABLE Table_to_Set (
   TableName varchar NOT NULL,
   SetID integer NOT NULL,
   PRIMARY KEY (TableName, SetID)
);
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Таблица с одним полем - быть или не быть?
От: Other Sam Россия  
Дата: 29.04.10 13:07
Оценка:
On 04/29/2010 08:02 PM, Other Sam wrote:
> Что-то страшное вы описываете.

Забыл сказать...
Информация о структуре таблицы, о ее назначении... вообще обо всем что
связанно с таблицей доступно во время разработки программы. Поэтому
"список атрибутов для таблицы" — это что-то УЖАСНОЕ!!! Это 100% ошибка в
понимании задачи.
У таблицы могут быть какие-то "атрибуты", но они должны быть такими,
чтобы можно было записать их на листочек и повешать на стену в офисе. И
не должно возникнуть необходимости заносить их в саму базу данных.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Таблица с одним полем - быть или не быть?
От: wildwind Россия  
Дата: 29.04.10 13:15
Оценка: +1
Здравствуйте, Other Sam, Вы писали:

OS>"список атрибутов для таблицы" — это что-то УЖАСНОЕ!!! Это 100% ошибка в

OS>понимании задачи.
OS>...
OS>не должно возникнуть необходимости заносить их в саму базу данных.

Ты еще не сталкивался с большими тиражируемыми системами-конструкторами?
Re[4]: Таблица с одним полем - быть или не быть?
От: Sinix  
Дата: 29.04.10 13:29
Оценка:
Здравствуйте, _FRED_, Вы писали:

Цель — шарить один и тот пресет между несколькими сущностями, так? Других вариантов что-то не вижу.
Можно в табличке Attributes (я бы обозвал как AttributeSets или AttributePresets) добавить кучу булевых полей (ReferrableByTable1, ReferrableByTable2...) — для сценариев "пресет такой-то может быть назначен таблице такой-то и другой-то". Хоть какая-то польза будет.

Будут грабли с неочевидными зависимостями — помним "и я подумал — а зачем мне два диска c:?" Может, можно обойтись без шаринга?

P.S. Если атрибутов мало, можно извратиться — назначаем каждому атрибуту ID = степени двойки, храним в ссылающемся поле bitmask — вуаля
P.P.S. Если пресеты важны как самостоятельные сущности, изврат ничем не поможет, зато вынесет мозг саппорту.
Re[3]: Таблица с одним полем - быть или не быть?
От: Sinix  
Дата: 29.04.10 13:36
Оценка:
Здравствуйте, Other Sam, Вы писали:

OS>Вот пример первые три таблицы определяют атрибуты и наборы атрибутов

OS>(многие-ко-многим), последняя таблица связь Имя Таблицы и Наборы
OS>Атрибутов (тоже многие-ко-многим).
В оригинальной постановке задачи Attribute_to_Set явно лишний — каждый атрибут входит строго в одни набор. У наборов нет SetData

OS>Что-то страшное вы описываете.

Так вы описали практически то же самое.

*подозрительно: доктор, а откуда у вас такие картинки?
** EAVом попахивает.
Re[5]: Таблица с одним полем - быть или не быть?
От: Other Sam Россия  
Дата: 30.04.10 05:29
Оценка:
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();
-- и еще таблицы связей

Вот и все. Структура базы данных в процессе эксплуатации не изменяется.
Posted via RSDN NNTP Server 2.1 beta
Re: Таблица с одним полем - быть или не быть?
От: MasterZiv СССР  
Дата: 30.04.10 19:01
Оценка:
_FRED_ пишет:

> Существуют ли ситуации, когда в реляционной базе данных было бы

> оправдано (с точки зрения нормального дизайна, а не кривых требований
> :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым,
> первичным ключём?

Нет. У такой таблицы нет атрибутов, только первичный ключ. Значит, нет данных.
Таблица бесполезна.
Posted via RSDN NNTP Server 2.1 beta
Re: Таблица с одним полем - быть или не быть?
От: vmpire Россия  
Дата: 30.04.10 23:34
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?

Существуют. Например, реализация наследования в базе.
Пример: базовый класс: действующее лицо системы (живёт в таблице с одной автоинкрементной колонкой)
Дочерние классы: поставщик (таблица "поставщик", ссылается на действующее лицо),потребитель (таблица "потребитель", ссылается на действующее лицо), менеджер (таблица "менеджер ", ссылается на действующее лицо) и так далее.
Имея такую структуру, мы можем легко и однотипно обрабатывать все сущности. Например, добавить таблицу "адрес", ссылающуюся на "действующее лицо".
Пример не выдуманный, отлично жил в работающей системе.
Re[6]: Таблица с одним полем - быть или не быть?
От: Sinix  
Дата: 01.05.10 01:14
Оценка:
Здравствуйте, Other Sam, Вы писали:

OS>то в реляционной базе так и нужно сделать.

О! а вот и EAV...
Re[2]: Таблица с одним полем - быть или не быть?
От: Sinix  
Дата: 01.05.10 01:32
Оценка: +1
Здравствуйте, vmpire, Вы писали:

V>Существуют. Например, реализация наследования в базе.

Я тут покритикую чуть-чуть. Без деталей тяжело судить предметно, но решение кажется надуманным. Единственное общее между всеми лицами в вашем изложении — это то, что все они — люди. Правда, непонятно как быть, если появятся юридические. С таблицей IndividualsOrIncorporatedPersons выйдет ровно то же, что и с набором атрибутов — общих полей у них нет. Можно конечно завести в ссылающихся таблицах два внешних ключа с чеком, что один их них null — выглядит так же криво.

А самая тоска — когда содержимое таблиц зависит от типа лица. Редко, но бывает.

V>Имея такую структуру, мы можем легко и однотипно обрабатывать все сущности. Например, добавить таблицу "адрес", ссылающуюся на "действующее лицо".

Чего-чего? Адреса вообще-то существуют сами по себе. Может, вы про табличку "ID лица/ID адреса/тип адреса"? Так её обычно денормализуют или разбивают на несколько.

Юр. и физлица — вообще идеальный пример влияния дырявых абстрацкий на дизайн.
Re[2]: Таблица с одним полем - быть или не быть?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 01.05.10 03:57
Оценка: +1 :)
Здравствуйте, vmpire, Вы писали:

_FR>>Существуют ли ситуации, когда в реляционной базе данных было бы оправдано (с точки зрения нормального дизайна, а не кривых требований :о)) наличие таблицы только лишь с одним полем: автоинкрементным целым, первичным ключём?

V>Существуют. Например, реализация наследования в базе.
V>Пример не выдуманный, отлично жил в работающей системе.

Если он жил именно в таком минимальном варианте — одно поле в базовой таблице объектов, то вам есть еще куда расти
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.