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   |
+----+-------------+-----+

  • Вопрос задан
  • 219 просмотров
Пригласить эксперта
Ответы на вопрос 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
Кнопконажиматель и припоерасплавлятель
Если возникла задача с "бесконечной схемой", то либо задача не для реляционной БД, либо модель данных требует пересмотра.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы