Здравствуйте.
Есть некий веб-сервис, который позволяет пользователям загружать табличные данные (например CSV). Столбцы этих данных определяются пользователями.
Пример такого файла:
| ID | Name | Color | Size |
|-----|--------|--------|--------|
| A11 | Apple | Green | Medium |
| B22 | Banana | Yellow | Big |
| C33 | Carrot | Red | Small |
Может потребоваться фильтрация по отдельным столбцам, поэтому мой вариант схемы такой:
`fields_list`:
| field_id | data_file_id | field_name |
|----------|--------------|------------|
| 11 | 123 | ID |
| 12 | 123 | Name |
| 13 | 123 | Color |
| 14 | 123 | Size |
Primary key - `field_id`
`fields_data`:
| field_id | line_number | field_value |
|----------|-------------|-------------|
| 11 | 1 | A11 |
| 12 | 1 | Apple |
| 13 | 1 | Green |
| 14 | 1 | Medium |
| 11 | 2 | B22 |
| 12 | 2 | Banana |
| 13 | 2 | Yellow |
| 14 | 2 | Big |
| 11 | 3 | C33 |
| 12 | 3 | Carrot |
| 13 | 3 | Red |
| 14 | 3 | Small |
Primary key - `field_id`+`line_number`
Вопрос #1: Хороша ли эта схема в данном случае? Какие проблемы она может вызвать? Есть ли лучшие варианты?
---
Мой коллега предлагает иной вариант:
`DataFile_123`:
| ID | Name | Color | Size |
|-----|--------|--------|--------|
| A11 | Apple | Green | Medium |
| B22 | Banana | Yellow | Big |
| C33 | Carrot | Red | Small |
В этом случае мы должны создавать таблицу для каждого файла, а также создавать столбцы в этой таблице, когда пользователь задает их.
На мой взгляд такой подход создает кучу проблем (да, у нас могут быть тысячи файлов). И я вижу только одно небольшое преимущество - легче делать выборки.
Вопрос #2: Эта схема действительно настолько плоха, насколько мне кажется? Есть хоть какие-то причины использовать ее?