Модель элексир дБ


Я разработал эту модель, которая является очень гибкой. Например, вы можете создать видах активов, активов и их комбинаций бесконечно. Это передний конец веб-сайте Python пирамиды, поэтому все проверки и бизнес-логика выполняется веб-приложение.

Однако, не будучи парнем дБ, у меня есть подозрение, что схема отстой. Могут быть проблемы с производительностью и т. д., Что не предусмотрено и т. д.

class Asset(Entity):
    has_field('TimeStamp', Unicode, nullable=False)
    has_field('Modified', Unicode)
    belongs_to('AssetType', of_kind='AssetType', inverse='Assets')
    has_many('Values', of_kind='Value', inverse='Asset')
    Assets = ManyToMany('Asset')

    @property  
    def Label(self):
        if self.AssetType:
            for f in self.AssetType.Fields:
                if f.Label:
                    if self.Values:
                        for v in self.Values:
                            if v.Field.Name == f.Name:
                                return v.Value

    def __repr__(self):
        return '<Asset | %s>' % self.id

class AssetType(Entity):
    has_field('Name', Unicode, primary_key=True)
    has_field('Plural', Unicode)
    has_many('Assets', of_kind='Asset', inverse='AssetType')
    has_many('Fields', of_kind='Field', inverse='AssetType')

class Value(Entity):
    has_field('Value', Unicode)
    belongs_to('Asset', of_kind='Asset', inverse='Values')
    belongs_to('Field', of_kind='Field', inverse='Values')

class Field(Entity):
    has_field('Name', Unicode)
    has_field('Unique', Unicode, default=False)
    has_field('Label', Boolean, default=False)
    has_field('Searchable', Boolean, default=False)
    has_field('Required', Boolean, default=False)
    has_many('Values', of_kind='Value', inverse='Field')
    belongs_to('FieldType', of_kind='FieldType', inverse='Fields')
    belongs_to('AssetType', of_kind='AssetType', inverse='Fields')

class FieldType(Entity):
    has_field('Name', Unicode, primary_key=True)
    has_field('Label', Unicode, unique=True)
    has_many('Fields', of_kind='Field', inverse='FieldType')


245
3
задан 5 августа 2011 в 01:08 Источник Поделиться
Комментарии
1 ответ

Ты заново открыл базу данных внутри базы данных. В основном, актив/AssetType является моделирование базы данных внутри базы данных, которые будут в результате будет медленным. Также, вы собираетесь потратить много усилий, переопределив функции базы данных.

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

@property  
def Label(self):
if self.AssetType:
for f in self.AssetType.Fields:
if f.Label:
if self.Values:
for v in self.Values:
if v.Field.Name == f.Name:
return v.Value

Это действительно вложенными, что это плохой знак. Я предлагаю что-то вроде:

@property
def Label(self):
if self.AssetType:
label = self.AssetType.Label
field = self.find_field(label)
if field:
return field.Value

Или если вы используете шаблон null объект:

@property
def Label(self):
return self.find_field(self.AssetType.label).Value

3
ответ дан 5 августа 2011 в 03:08 Источник Поделиться