Самая простая модель будет выглядеть примерно так:
CarClass{
name:string
race<-->Race.carClass
cars<-->>Car.carClass
}
Car{
name:string
carClass<<-->CarClass.cars
}
Race{
name:string
carClass<-->>CarClass.race
}
Не думайте, что это термины SQL, думайте об этом в терминах объекта.Каждая сущность должна представлять реальный объект, событие или условие, которое вы хотите смоделировать.Отношения между объектами должны имитировать отношения реального мира.Если в реальных вещах Race
и Car
есть общие отношения с условием CarClass
, то вы просто помещаете это в модель.
В отличие от SQL, объектные модели могут быть сколь угодно сложными и содержать поведение.Вы не просто застряли с таблицами, столбцами и строками.
Обновление:
( См. Обновление в OP для справки )
Когда вы обнаружите, что вводите то же значение атрибута вдве или более разных сущностей, что обычно означает, что вам нужно создать новую сущность для моделирования этого значения.
В этом случае, хотя с точки зрения данных значение carClass - это просто строка логически это отдельная вещь, связанная как с объектами Race
, так и Car
.Итак, чтобы точно смоделировать его, вам нужно предоставить для него отдельную сущность.Кроме того, вам нужно моделировать конкурентов, поэтому вам нужна модель, которая выглядит примерно так:
CarClass{
class:string
race<-->Race.carClass
cars<-->>Car.carClass
}
Car{
name:string
carClass<<-->CarClass.cars
competitor<-->>Competitor.car
}
Race{
name:string
carClass<-->CarClass.race
}
Competitor{
name:string
car<-->Car.competitor
}
(обратите внимание, что в этой модели предполагается, что все гонки определяются их автомобильным классом, а не отдельными транспортными средствами или водителями.)
Итак, чтобы найти всех конкурентов определенной расы, вы должны пройтись Race.carClass.cars.competitor
.
Это, вероятно, не совсем то, что вы хотите, но вы можете понять, как вы используете сущностии отношения для моделирования реальных объектов, событий или условий и связей между ними.