Правильная структура БД для таких данных?

Asar

Новичок
Правильная структура БД для таких данных?

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

Например, Муха1 (ниже в скобках указываются источники информации):
Размер — 13мм (книжка такая-то) 15мм (книжка такая-то) 16мм (сайт такой-то).
Цвет — Зеленый (сайт такой-то) Синий (книжка такая-то)


Соответственно, в одной табличке так просто уже признаки для каждой мухи не похранишь. Предполагаю, что нужно сделать так:

Таблица видов мух — Id + однозначные признаки для каждой мухи
Таблица источников информации — Id и пр.
Таблицы для каждого неоднозначного признака. Например, таблица размеров мух:
Id мухи — Размер мухи — Id Источника информации, что размер именно такой. Т.е. Муха1 — 13 — 158.

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

baev

‹°°¬•
Команда форума
Я бы и «однозначные» признаки хранил в третьей таблице. Возможно, с флагом «однозначный».

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

И я не вижу, где у Вас названия признаков. Откуда известно, что «13» — это именно «размер»?

А названий у этих видов мух нет?
 

Asar

Новичок
Нет, однозначность оспариваться не будет, это 100%.

Названия у мух есть. Одно однозначное и несколько неоднозначных.

Названия признаков:
Id мухи — 1
Размер мухи — 13
Id Источника — 158...
 

baev

‹°°¬•
Команда форума
Названия признаков:
Id мухи — 1
Размер мухи — 13
Id Источника — 158...
Я невнимательно прочёл вначале.

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

Где названия мух хранятся, я так и не понял.
 

A1x

Новичок
почитайте если еще не - http://en.wikipedia.org/wiki/Entity-Attribute-Value_model
возможно появятся какие-то хорошие идеи
 

Asar

Новичок
baev, названия мух хранятся в таблице с однозначными признаками. Примерно такие поля в ней:
Id мухи — Название мухи — Общее описание мухи.

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

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

A1x

Новичок
к сожалению этой статьи нет на русском.
примерно так:
таблицы:
fly - табл. мух (постоянные признаки)
source - таблица источников данных
attribute - таблица атрибутов (может дополнятся в дальнейшем)
fly_eav - таблица где хранятся собственно данные

fly
---------------
fly_id int
fly_type varchar

значения всех "неконкретных" аттрибутов храним в одной таблице

fly_eav
----------------
eav_id int
fly_id int
attr_id int
added_at datetime
source_id int
value_int int
value_varchar varchar
value_float float
....


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

Asar

Новичок
А, понятно. Можно все запихнуть в одну таблицу, каждый раз прописывая Id признака. И правда интересный вариант, сейчас попробую.
Спасибо!
 

A1x

Новичок
тип данных для каждого признака можно хранить в табл. attribute чтобы знать из какого поля читать значение
 
Сверху