2010-06-04 3 views
0

Я разработал структуру базы данных, в которой данные собираются о машинах в течение определенного периода времени для исследовательских целей. Владелец автомобиля ежемесячно вводит большое количество связанных данных об автомобиле, его производительности и т. Д. Однако теперь мне приходится обрабатывать ситуации, когда собственность на автомобиль переносится (возможно, не раз), и мне интересно, что лучший способ справиться с этим в базе данных будет.Запрос на проектирование базы данных

Если автомобиль передан, предыдущий владелец больше не сможет добавлять данные о машине, однако они все равно должны иметь возможность просматривать данные, которые они ввели до даты передачи. Новый владелец сможет ввести данные о машине с даты передачи и далее. В исследовательских целях мне нужно иметь возможность присоединяться к данным между этими переданными записями автомобилей и объединять их в один набор данных.

В настоящее время каждая запись автомобиля в db принадлежит владельцу через внешний ключ в таблице Cars. То, о чем я сейчас думаю, заключается в создании рекурсивных отношений между родителями и детьми между автомобильными записями, где одна запись автомобиля может принадлежать к другой автомобильной записи (например, car_id как иностранный ключ в Car car). Если запись автомобиля принадлежит к другой записи автомобиля, это указывает на передачу. Это позволяет мне сохранить набор данных каждого автомобильного регистра (специфический для его владельца), а также объединить связанные записи автомобилей. В дополнение к этому, я подумываю о добавлении таблицы Car_transfer, чтобы записать дополнительные данные о передаче (возможно, только дату на самом деле, так как предыдущие и новые владельцы будут очевидны из owner_ids в таблице Car) - добавление date_transferred столбец в записи автомобиля, вероятно, будет в значительной степени избыточным для большинства записей, поэтому я не уверен, что эти данные заслуживают новой таблицы отношений.

В любом случае, я надеюсь, что это имеет смысл! Я крутился вокруг, пытаясь найти разумное решение - любой совет будет очень благодарен!

ответ

2

Вам не нужно рекурсивный родителя/ребенка здесь, но только Многие-ко-многим:

В основном вам нужны ссылки таблица [Автомобили-владельцев]:

car_id, owner_id, ownership_date 

Таким образом, вы будут иметь данные в нем:

--------------- 
1, 2, 2009-01-01 
1, 3, 2010-05-01 
... 

Тот же автомобиль, принадлежащий двум людям с разными датами.

+0

Имеет смысл - гораздо проще, чем мое предложение. Я мог бы просто добавить «перенесенный» столбец в таблицу M-N, чтобы указать, что у этого владельца больше нет собственности. – kenny99

+0

@ kenny99: Не требуется, если вы не хотите разрешать нескольким одновременным владельцам автомобиля. Просто найдите последнюю дату в таблице владения для данного идентификатора автомобиля. –

+0

Я думал, что для того, чтобы предыдущий владелец не ввел новые данные об автомобиле (который был перенесен), простой переданный флаг будет легко работать на уровне приложения (например, если ($ owner-> car- > transfer = 0), разрешите продолжить), но я полагаю, этого можно было бы избежать, просто проверяя, есть ли у car_id запись с более поздней датой владения, чем у владельца, который подписал - что вы думаете? – kenny99

2

Я бы добавил таблицу владельцев автомобилей. Рекурсивный дизайн не слишком интуитивно понятен.