Имея поведение, подобное экземпляру в базах данных - PullRequest
0 голосов
/ 25 августа 2009

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

У меня есть общий элемент, представляющий группу, назовем его Автомобиль . Теперь этот Автомобиль имеет атрибуты, которые находятся в определенных пределах, скажем, например, скорость составляет от 0 до 180 для обычного Автомобиля . Представьте здесь еще несколько атрибутов с диапазонами, например, цвет может быть от 0 до 255, независимо от того, что может означать это значение.

Итак, в моей таблице GenericItems У меня есть:

ID    Name

 1    Car

А в моих Атрибутах У меня есть:

ID   Name   Min_Value    Max Value
 1   Speed     0            180
 2   Color     0            255

Соотношение между Car и Attributes, таким образом, равно 1: n.

Теперь у меня появляются очень специфические экземпляры моего автомобиля , например, FordMustang, A FerrariF40 и DodgeViper. Это конкретные экземпляры, и теперь я хочу дать им конкретные значения для их атрибутов.

Итак, в моей таблице SpecificItem У меня есть:

ID    Name           GenericItem_ID

 1    FordMustang         1
 2    DodgeViper          1
 3    FerrariF40          1

Теперь мне нужна третья таблица SpecificAttributes2SpecificItems , чтобы сопоставить атрибуты с SpecificItems :

ID    SpecificItem_ID   Attribute_ID   Value

 1         1                1           120        ;Ford Mustang goes 120 only
 2         1                2           123        ;Ford Mustang is red
 3         2                1           150        ;Dodge Viper goes 150
 4         2                2           255        ;Dodge Viper is white
 5         3                1           180        ;FerrariF40 goes 180
 6         3                2             0        ;FerrariF40 is black

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

Я хочу иметь возможность иметь несколько общих элементов с несколькими атрибутами с минимальными / максимальными значениями в качестве интервала, которые могут быть "созданы" с конкретными значениями

Ответы [ 4 ]

1 голос
/ 25 августа 2009

Пара идей:

Во-первых, вы должны рассмотреть вопрос о том, чтобы сделать вашу таблицу «обобщенных групп» «атрибутом», а не чем-то, что паряет над остальными данными.

Во-вторых, вам может быть проще, когда каждая таблица атрибутов фактически содержит атрибуты элементов, а не просто идею атрибутов. Если вы хотите иметь диапазон, рассмотрите либо тип enum (для имен элементов), либо просто целое число с установленным максимумом (поэтому значение столбца color_value не может быть больше 255). Таким образом, вы получите что-то более похожее на:

  Item Table
   ID    Name 

    1    FordMustang 
    2    DodgeViper  
    3    FerrariF40

   ItemType Table:

   ItemID     Type
     1         Car
     2         Car
     3         Car


   ItemColor Table:

   ItemID     ColorID
     1         123
     2         255
     3           0

   MaxSpeed Table

   ItemID     MaxSpeedID

     1        120
     2        150
     3        180
1 голос
/ 25 августа 2009

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

http://en.wikipedia.org/wiki/Entity-attribute-value_model http://ycmi.med.yale.edu/nadkarni/Introduction%20to%20EAV%20systems.htm

Обсуждение EAV ведет к «религиозным войнам», так как хороших мест для его использования очень мало (многие люди говорят, что хороших мест нет), и есть другие люди, которые считают, что, поскольку он очень гибкий, использоваться везде. Если я найду нужную ссылку, я добавлю ее к этому.

1 голос
/ 25 августа 2009

Существует школа мысли, которая считает, что любая попытка построить модель EAV в СУБД представляет собой «плохой дизайн», но мы туда не пойдем. Ой, похоже, кто-то другой уже сделал.

Я не уверен, что тебя беспокоит. SpecificAttributes2SpecificItems - таблица пересечений (подсказка в названии). Обязательно содержит ссылки на Атрибуты и SpecificItems . Как это не могло?

Вероятно, вам нужно иметь MinVal и MaxVal на SpecificAttributes2SpecificItems , поскольку некоторые элементы будут иметь более ограниченный диапазон, чем разрешено GenericItems . Например, все знают, что Ferrari должен быть доступен только в красном цвете.

1 голос
/ 25 августа 2009

Самый простой способ использовать наследование в моделях баз данных - это использовать инструмент ORM. Для Python есть SQLAlchemy, Django и другие.

Теперь вы должны задаться вопросом, например, Ford Mustang - это своего рода Автомобиль или экземпляр Автомобиля. В первом случае вы должны создать таблицу ford_mustang, определяющую атрибуты ford_mustang. Таблица ford_mustang также должна иметь внешний ключ к таблице car, где указываются общие атрибуты каждого FordMustang. В последнем случае каждый вид автомобиля - это просто строка в таблице Car. В любом случае каждый атрибут должен быть представлен в одном столбце.

Проверка атрибутов обычно выполняется в бизнес-логике приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...