Задать вопрос
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант

Как сделать таблицу с произвольным количеством полей?

Подскажите, пожалуйста, как сделать таблицу в реляционной БД, чтобы потом можно было добавлять поля, не изменяя структуру таблицы? При этом нужно уложиться в минимальное количество таблиц. Я так понимаю, можно хранить в паре таблиц (или даже одной достаточно?):
https://app.dbdesigner.net/designer/schema/265467
в ObjectId храним id записи "большой" таблицы, FieldName и Value хранят имя поля "большой" таблицы и его значение.
Как это потом достать запросом и получить двумерную таблицу со всеми описанными полями и значениями в них?
Всё что пока сообразил:
spoiler

+----+----------+---------+-------------+
| id | ObjectId | Value   | FieldName   |
+----+----------+---------+-------------+
| 1  | 1        | 1запись | description |
+----+----------+---------+-------------+
| 2  | 1        | 1       | val         |
+----+----------+---------+-------------+
| 3  | 2        | 2       | val         |
+----+----------+---------+-------------+
| 4  | 2        | 2запись | description |
+----+----------+---------+-------------+


и запрос на 1 поле
(SELECT o.id,f.value as 'description' from test1.dbo.Objects as o
  JOIN test1.dbo.Fields f ON o.id = f.ObjectId where FieldName like 'description')

который выдаёт
spoiler

+----+-------------+
| id | description |
+----+-------------+
| 1  | 1запись     |
+----+-------------+
| 2  | 2запись     |
+----+-------------+


а надо чтобы было
spoiler

+----+-------------+-----+
| id | description | val |
+----+-------------+-----+
| 1  | 1запись     | 1   |
+----+-------------+-----+
| 2  | 2запись     | 2   |
+----+-------------+-----+

  • Вопрос задан
  • 242 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 4
Stalker_RED
@Stalker_RED
Похоже, что вы пытаетесь изобрести EAV.
1, 2
Ответ написан
coderisimo
@coderisimo
table_1 : id, title
table_2: id, field, value - id ссылается на первую таблицу

select* from table_2 where id = 1 // получаем все поля связанные с первой записью в таблице 1

select* from table_2 where id = 1 AND field='лишний вес' // получаем поле лишний вес для первой записи в таблице 1
Ответ написан
Комментировать
VladimirAndreev
@VladimirAndreev
php web dev
Если у вас есть чёткое понимание структуры таблиц, то:
1. В таблице есть физический первичный ключ
2. В таблице есть физические поля под внешние ключи
3. В таблице есть физические поля под основные индексы
4. В таблице есть json поле для всех остальных данных.
Ответ написан
Комментировать
AndyKorg
@AndyKorg
Кнопконажиматель и припоерасплавлятель
Если возникла задача с "бесконечной схемой", то либо задача не для реляционной БД, либо модель данных требует пересмотра.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы