Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > таблицу типа "таблицы умножения" в БД


Автор: shuttle 26.3.2011, 20:23
Всем известно что такое таблица умножения. Умножаем число а на число b - находим в верхней строке число a, в первом столюце число  b и на их пересечении получаем результат.
Допустим в БД есть такая таблица - как с ней работать, т.е. когда пишем запрос мы указываем название столбца и значение = на выходе результат несколько строк, в которых значение в данном столбце равно заданному в условии. 
А тут получается надо найти сначала нужный столбец, потом строку и на перекрестье получить их значение.
Перебиваить таблицу, так что бы указывать все комбинации идея плохая.
Как в БД работают с такими таблицами?

Автор: Экскалупатор 26.3.2011, 20:56
shuttle, что то мне кажется сомнительным что в бд могут понадобиться подобные таблицы. их всегда можно представить в более логичной(с точки зрения реляционной модели) формы. в какой реальной задаче может понадобится таблица с подобным устройством?

отступление: коль уж сильно надо, то выбери столбец и отсчитай количество строк, получится требуемая ячейка. т.е. если 3х4 то выбираем столбец № 3 и в этом столбце смотрим результат 4.

Автор: jonie 26.3.2011, 21:03
угу, нечто вроде
Код

int a = 10;
int b = 20;
string sql = "select col" + a + " FROM tab WHERE rowId=" + b;

...
SqlCommand sqlcmd = new SqlCommand(sql);
int result = (int)sqlcmd.ExecuteScalar;


Автор: Gluttton 26.3.2011, 22:38
Цитата(shuttle @  26.3.2011,  20:23 Найти цитируемый пост)
Как в БД работают с такими таблицами? 

Я бы сделал это так:
Код

create table rows
(
    value int
);

insert into rows (value) values (0);
insert into rows (value) values (1);
insert into rows (value) values (2);
insert into rows (value) values (3);
insert into rows (value) values (4);
insert into rows (value) values (5);
insert into rows (value) values (6);
insert into rows (value) values (7);
insert into rows (value) values (8);
insert into rows (value) values (9);

create table columns
(
    value int
);

insert into columns (value) values (0);
insert into columns (value) values (1);
insert into columns (value) values (2);
insert into columns (value) values (3);
insert into columns (value) values (4);
insert into columns (value) values (5);
insert into columns (value) values (6);
insert into columns (value) values (7);
insert into columns (value) values (8);
insert into columns (value) values (9);

select
    rows.value * columns.value as value
from rows, columns
    wehe rows.value = 2
    and columns.value = 2;

Автор: Экскалупатор 26.3.2011, 22:52
и все таки я думаю что подобные таблицы использовать не кошерно, вроде одно из правил нормализации гласит что если поле можно вычислить то оно не должно содержаться в таблице в явном виде. в случае с таблицей умножения ее можно вычислить всю. а какие данные можно было бы хранить в таком виде и при этом их нельзя было бы вычислить я представить не могу. в любом случае можно сделать вполне нормальную структуру таблиц и избежать такого непонятного хранения как хочет топикстартер.

Автор: Gluttton 26.3.2011, 23:00
Цитата(Экскалупатор @  26.3.2011,  22:52 Найти цитируемый пост)
а какие данные можно было бы хранить в таком виде и при этом их нельзя было бы вычислить я представить не могу.

Это конечно же офтопик, но тем не менее...

Может быть такой случай если необходимо хранить в таблице фактические значения измеряемых величин.
Например если необходимо в таблице хранить данные о значении напряженности электромагнитного поля некоторого источника на разных высотах и удалениях, то результатом может стать таблица обращаясь к которой с запросом будет смысл получать значение именно одной ячейки на пересечении конктетной строки (например высота) и конкретного столбца (например удаление).

Но в то же время, если в такой таблице хранились бы значения не фактические, а расчетные, то тогда целесообразность такой таблицы была бы сомнительна.

Всё чисто субьективно.

Автор: Экскалупатор 27.3.2011, 00:52
Цитата(Gluttton @  26.3.2011,  22:00 Найти цитируемый пост)
Например если необходимо в таблице хранить данные о значении напряженности электромагнитного поля некоторого источника на разных высотах и удалениях, то результатом может стать таблица обращаясь к которой с запросом будет смысл получать значение именно одной ячейки на пересечении конктетной строки (например высота) и конкретного столбца (например удаление).

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

Автор: jonie 27.3.2011, 12:24
Экскалупатор, мне только один раз понадобилась такая конструкция - это был отчет по датам в mssql2000 (он не поддерживает PIVOT)

Автор: Экскалупатор 27.3.2011, 12:32
jonie, и его оказалось удобнее хранить в такой конструкции? а если разбить на несколько таблиц? мне если честно не приходилось с подобным сталкиваться, так что тема интересна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)