Интерактивный сюжет Barchart

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

То, что вы хотите сделать, довольно просто, но не обязательно легко. Важным моментом в этом виде супертипа / подтипа (также известный как эксклюзивная дуга) является невозможность иметь ряды седанов, ссылающихся на строки о полуавтоматах и ​​т. Д.

MySQL делает код более подробный, поскольку он не устанавливает ограничений CHECK. Ты счастливчик; в вашем приложении ограничения CHECK могут быть заменены дополнительными таблицами и ограничениями внешнего ключа. Комментарии ссылаются на SQL выше .

create table vehicle_types (
  veh_type_code char(1) not null,
  veh_type_name varchar(10) not null,
  primary key (veh_type_code),
  unique (veh_type_name)
);

insert into vehicle_types values
('s', 'Semi-truck'), ('c', 'Car');

Это то, что я мог бы реализовать как ограничение CHECK на других платформах. Вы можете это сделать, когда смысл кода для пользователей очевиден. Я бы ожидал, что пользователи узнают или выяснят, что «для» - для semis, а «c» - для автомобилей, или что код просмотров / приложения будет скрывать коды от пользователей.

create table vehicles (
  veh_id integer not null,
  veh_type_code char(1) not null,
  other_columns char(1) default 'x',
  primary key (veh_id),
  unique (veh_id, veh_type_code),
  foreign key (veh_type_code) references vehicle_types (veh_type_code)
);

Ограничение UNIQUE позволяет двум столбцам {veh_id, veh_type_code} быть объектом ссылки внешнего ключа. Это означает, что строка «автомобиль» не может ссылаться на «полу», даже по ошибке.

insert into vehicles (veh_id, veh_type_code) values
(1, 's'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c'), 
(6, 'c'), (7, 'c');

create table car_types (
  car_type char(3) not null,
  primary key (car_type)
);

insert into car_types values
('Van'), ('SUV'), ('Sed');

create table veh_type_is_car (
  veh_type_car char(1) not null,
  primary key (veh_type_car)
);

Что-то еще, что я использовал бы как ограничение CHECK на других платформах. (См. Ниже.)

insert into veh_type_is_car values ('c');

Только одна строка.

create table cars (
  veh_id integer not null,
  veh_type_code char(1) not null default 'c',
  car_type char(3) not null,
  other_columns char(1) not null default 'x',
  primary key (veh_id ),
  unique (veh_id, veh_type_code, car_type),
  foreign key (veh_id, veh_type_code) references vehicles (veh_id, veh_type_code),
  foreign key (car_type) references car_types (car_type),
  foreign key (veh_type_code) references veh_type_is_car (veh_type_car)
);

Значение по умолчанию для veh_type_code, а также ссылка на внешний ключ для veh_type_is_car, гарантирует, что эти строки в эта таблица может быть только о машинах и может только эталонных транспортных средствах, которые являются автомобилями. На других платформах я просто объявляю столбец veh_type_code как veh_type_code char(1) not null default 'c' check (veh_type_code = 'c').

insert into cars (veh_id, veh_type_code, car_type) values
(2, 'c', 'Van'), (3, 'c', 'SUV'), (4, 'c', 'Sed'),
(5, 'c', 'Sed'), (6, 'c', 'Sed'), (7, 'c', 'Sed');

create table sedan_types (
  sedan_type_code char(1) not null,
  primary key (sedan_type_code)
);

insert into sedan_types values
('g'), ('d'), ('h'), ('e');

create table sedans (
  veh_id integer not null,
  veh_type_code char(1) not null,
  car_type char(3) not null,
  sedan_type char(1) not null,
  other_columns char(1) not null default 'x',
  primary key (veh_id),
  foreign key (sedan_type) references sedan_types (sedan_type_code),
  foreign key (veh_id, veh_type_code, car_type) references cars (veh_id, veh_type_code, car_type)
);

insert into sedans (veh_id, veh_type_code, car_type, sedan_type) values 
(4, 'c', 'Sed', 'g'), (5, 'c', 'Sed', 'd'), (6, 'c', 'Sed', 'h'),
(7, 'c', 'Sed', 'e');

Если вам нужно создать дополнительные таблицы, которые ссылаются на седаны, такие как gas_sedans, diesel_sedans и т. Д., Тогда вам нужно для создания таблиц с одной строкой, аналогичных «veh_type_is_car», и установки ссылок на внешние ключи для них.

В процессе производства я отменил разрешения для базовых таблиц и либо использовал

  • обновляемые представления для вставки и обновления или
  • хранимые процедуры для вставки и обновления.
0
задан Calum 6 March 2019 в 14:58
поделиться

1 ответ

Я использовал автономный метод построения plotly.offline.iplot, который не требует привязки к сетке. Единственный недостаток анимации с гистограммами - это то, что переходы в настоящее время не поддерживаются.

Код ниже (включая кнопки и ползунок):

from plotly.offline import init_notebook_mode, iplot
from IPython.display import display, HTML

init_notebook_mode(connected = True)

years = ['2010', '2011', '2012']
items = ['A', 'B', 'C', 'D']
count = [
  [1, 2, 3, 4],
  [2, 3, 4, 1],
  [3, 4, 1, 2]
]

figure = {
  'data': [{
    'type': 'bar',
    'x': items,
    'y': count[0]
  }],
  'layout': {
    'xaxis': {
      'title': 'X',
      'gridcolor': '#FFFFFF',
      'linecolor': '#000',
      'linewidth': 1,
      'zeroline': False,
      'autorange': False
    },
    'yaxis': {
      'title': 'Y',
      'gridcolor': '#FFFFFF',
      'linecolor': '#000',
      'linewidth': 1,
      'range': [0, 5],
      'autorange': False
    },
    'title': 'Example Title',
    'hovermode': 'closest',
    'updatemenus': [{
      'type': 'buttons',
      'buttons': [{
          'label': 'Play',
          'method': 'animate',
          'args': [None, {
            'frame': {
              'duration': 500,
              'redraw': True
            },
            'fromcurrent': True,
            'transition': {
              'duration': 300,
              'easing': 'quadratic-in-out'
            }
          }]
        },
        {
          'label': 'End',
          'method': 'animate',
          'args': [None, {
            'frame': {
              'duration': 0,
              'redraw': True
            },
            'fromcurrent': True,
            'mode': 'immediate',
            'transition': {
              'duration': 0
            }
          }]
        }
      ],
      'direction': 'left',
      'pad': {
        'r': 10,
        't': 87
      },
      'showactive': False,
      'type': 'buttons',
      'x': 0.1,
      'xanchor': 'right',
      'y': 0,
      'yanchor': 'top'
    }]
  },
  'frames': []
}

sliders_dict = {
  'active': 0,
  'yanchor': 'top',
  'xanchor': 'left',
  'currentvalue': {
    'font': {
      'size': 20
    },
    'prefix': 'Year:',
    'visible': True,
    'xanchor': 'right'
  },
  'transition': {
    'duration': 300,
    'easing': 'cubic-in-out'
  },
  'pad': {
    'b': 10,
    't': 50
  },
  'len': 0.9,
  'x': 0.1,
  'y': 0,
  'steps': []
}

for index, year in enumerate(years):
    frame = {
        'data': [{
          'type': 'bar',
          'x': items,
          'y': count[index]
        }],
        'name': str(year)
        }
    figure['frames'].append(frame)

    slider_step = {
      'args': [
        [year],
        {
          'frame': {
            'duration': 300,
            'redraw': True
          },
          'mode': 'immediate',
          'transition': {
            'duration': 300
          }
        }
      ],
      'label': year,
      'method': 'animate'
    }
    sliders_dict['steps'].append(slider_step)

figure['layout']['sliders'] = [sliders_dict]

iplot(figure)
0
ответ дан Calum 6 March 2019 в 14:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: