|
|
|
|
|
для: Trianon
(14.04.2009 в 23:03)
| | я не хотел вас обидеть, если что. ваш подход кстати упростил генерацию (вью стало меньше). спасибо.
там негде нулл ставить, там другая схема. там не
car
car_id, owner_id, engine, price
а
object - property - object instance - property instance
произвольная объектная структура, которая может одинаково легко описывать как автомобили, так и мячи для гольфа или собак.
автомобили это просто пример, в идеале можно создавать объект, настраивать список его свойств и поведений, после чего в таблице фактов создавать "экемпляры" с произвольным набором данных. здесь два преимущества: для создания нового объекта не надо создавать таблицу, а равно и интерфейс для ввода-отображения данных (оно само), плюс довольно легко анализировать в разных срезах (сколько было зеленых собак и дорогих мячей продано в прошлом квартале без нужды хождения по разным таблицам, все в одном месте). я просто за компьютером давно не сидел и пользуюсь тем что еще как-то помню.
в общем, при изменении структуры объекта буду генерировать соответствующее вью, делающие набор данных плоским для этого объекта.
задача как-то решена, спасибо! | |
|
|
|
|
|
|
|
для: zvzz
(14.04.2009 в 22:41)
| | Если некоторое свойство у строки неизвестно, то соответствующее поле обычно оставляется в состоянии NULL . Для этого совсем необязательно создавать еще одну таблицу. Впрочем, я ни на чем не настаиваю. | |
|
|
|
|
|
|
|
для: Trianon
(14.04.2009 в 21:36)
| | это неважно.. ну пусть дана какая-то таблица cars, где прописаны автомобили и допустим из владельцы. владельцы же не являются свойствами одного уровня с объемом двигателя ? вот они в отдельной таблице уровнем выше.
вот даны автомобили с владельцами, и к каждому привязан некий набор свойств. автомобиль цены не имеет если например не продается, а обхем двигателя, допустим, не знали, когда воодили данные. или цвет сидений не знали.
в общем случае будет таблица характеристик, где дан список свойств (объем, цена, тп), таблица автомобилей, и вот эта самая таблица их свойств. предположим, что вплоть до значений свойств все нормализовано, все индексы есть и все работает быстро.
а к этой самой таблице свойств требуется строить произвольные запросы. которые могут включать один параметр, а могут двадцать. для простоты предположим, что все свойства всех машин присутствуют в таблице свойств.
вот они все есть и надо достать все машины дороже 100 долларов и с объемом больше двух литров.
как?...
причем разумеется динамически доставать, то есть много вложенных селектов - плохо.
то что Вы написали это примерно то же самое, что и я - заджоинить столько таблиц со свойствами, сколько собственно свойств. я сейчас нарисовал вью, которое превращает эту таблицу в двумерную, как у Вас. но это не generic, то есть в базе данных появляются в коде значения из нее же. это неправильно. но в худшем случае придется генерировать такие вью при каждом изменении в списке свойств.
очень надеюсь что есть какое-то более простое решение. спасибо! | |
|
|
|
|
|
|
|
для: zvzz
(14.04.2009 в 21:26)
| | где таблица, на которую ссылается auto_id ? Это же явный чужой ключ.
SELECT c.*, p.value AS pr , e.value AS eng
FROM cars AS с
JOIN auto AS p ON c.id = p.auto_id AND p.property = 'price'
JOIN auto AS e ON c.id = e.auto_id AND e.property = 'engine'
WHERE p.value <= 500 AND e.value >= 2000
|
По-моему, Вы переусердствовали со схемой.
Трудно представить себе автомобиль, который не имеет цены или объема двигателя. | |
|
|
|
|
|
|
| товарищи,
слово селект я слышал много лет назад и уже сильно забыл. помогите пожалуйста.
дана таблица, для простоты, для автомобилей: auto с колонками
auto_id property value
и значениями, наприемр
1, 'engine', 3000
1, 'price', 600
2, 'engine', 1000
2, 'price', 100
требуется выбрать все автомашины, у которых например мотор больше двух литров и при этом цена больше пятисот. и свойств, понятное дело, неограниченное количество.
если написать
select * from auto a
where
(a.property ='engine' and a.value >= 2000)
and
(b.property ='price' and b.value <= 500)
оно размеется ничего не найдет потому что применяет запрос к одной строке.
если and заменить на or оно все найдет но мне ор, понятно, ни к чему.
ничего лучше чем несколько запросов я не придумал:
select * from auto a, auto b
where a.auto_id = b.item_id
and (
(a.property ='engine' and a.value >= 2000)
and
(b.property ='price' and b.value <= 500)
)
а это некрасиво и страшно неудобно, потому что свойств неограниченное количество, и иногда селект может выглядеть очень большим. в плане написано что оно делает в этом случае два простых запроса по where. но нет ли какого-то простого способа делать такие выборки, хорошо бы одним внутренним запросом ? задача ведь тривиальная и многолетней выдержки.
спасибо большое. | |
|
|
|
|