Система CXI

Взялся разрабатывать систему посвященную нашему здоровью на Yii. Но опыта практически нет.

Суть в том что есть таблица пользователей, которую я решил хранить в отдельной базе, и таблицы которые относятся к записям по здоровью пользователя, в другой базе. Если объединить эти базы в одну то количество таблиц увеличивается до бесконечности. Например, есть таблица человеческие органы, из неё вытекает таблица с болезнями, из болезней вытекает таблица лекарств, из лекарств вытекает таблица с хим. элементами и т. д…

А если таблицы разделены по базам, то при расширении предметной области создается новая база.

Система должна на основе этих данных выдавать рекомендации по здоровью.

Первый вопрос в том насколько концептуально правильно держать пользователей и инфу по их здоровью в разных базах? Как правильно организовать хранение этих данных?

Вопрос второй

Как сделать интерфейс для подключения стилей которые сделаны другими людьми. Например универсальный интерфейс для подключения flash стилей и стилей на php?

достаточно ли будет описать класс php, который будет выдавать информацию о кнопках, метках и т п?

система будет открытая поэтому если есть желание поучаствовать - пишите на мыло, предоставлю доступ к репозиторию.

  • MySQL особо пофиг на количество таблиц (точнее все будет хорошо до ~10 000 таблиц)

  • второй вопрос какой-то карявый…

  1. Вы сами представляете как вы замучаетесь потом обслуживать вашу "безконечность" таблиц когда они вам там создадутся. Плюс получите кучу минусов при администрировании и редактировании структуры своего проекта.

Я лично рекомендую такую большую структуру реализовывать по максимуму в виде обычного дерева. Т.е. вместо создания кучи таблиц у вас будет минимум справочников в виде всего списка болезней, органов, лекарст и прочего, а сама связка будет идти через одну таблицу-дерево которая будет отвечать за вложенность в органы->болезней->лекарств. По поводу кол-ва таблиц-справочников, надо посидеть и подумать над структурой полей, возможно все получится привести просто к одному огромному справочнику + управляющей таблице-дереву.

Еще непонятно почему вы решили часть таблиц создавать в одной БД, а другую часть - в другой. Какие цели вы при этом преследуете?

  1. В принципе подключить могут все что угодно, и без пре-модерации я бы не советовал это делать. А в целом просто держите все стили проекта в одном файле, давайте прямой доступ к его структуре всем пользователям и им возможность загружать свой файл аналогичной структуры через ЛК. Это если я вас правильно понял.

Лано второй вопрос пока опустим.

Просто предметная область может увеличится, в конце концов вылиться в другую систему.

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

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

Из этих рассуждений я пришел к выводу что нужно 3 базы:

Системная (где хранятся группы и пользователи)

БД "Здоровье"

БД "Планировщик"

тогда мы действительно можем расширять эти базы данных до бесконечности и не боятся что запутаемся. Но при этом между таблицами в разных БД будут отсутствовать referencы довольно не красиво с точки зрения MySQL. Придётся делать эти проверки в коде.

С другой стороны можно сделать одну БД для разных систем и отрабатывать структуру БД по частям.

Собственно если БД одна мы ничего не теряем, referencы остаются. Но при этом если мы захотим выкинуть в какой-то момент систему "Здоровье", чтобы заменить её на какую то более совершенную(основанную на более крутом frameworke чем Yii) первый способ предпочтительнее. Тем более в разных БД можно разграничить доступ для разных пользователей, а в одной БД MySQL можно ли сделать разные права пользователям для разных таблиц?

Я склоняюсь пока к второму способу.

Вопросы:

  1. На каком этапе я допустил ошибку в рассуждениях?

  2. Есть ли какие-нить полезные книги, статьи, в которых раскрывается эта тема?

  3. Стоит ли делать таблицу descriptions общую для всех таблиц хранящихся в бд, или лучше добавлять в каждой таблице поля name, description?

Всё таки не могу понять в MySQL если есть две таблицы users и messages

связь один ко многим:

users |------<| messages

id _ | . . . . | id

name | . . . . |_ id_user

_ _ _ | . . . . |_ message

если вставляем новую запись в message будет ли MySQL проверять существует ли пользователь с таким id с таким сообщением? если будет то в каком случае?

При этом средствами языка SQL мы не проверяем есть ли в таблице users пользователь с id_user.

PS просто не могу понять зачем в MySQL ключевое слово REFERENCE

PSPS прочитал в руководстве MYSQL:

Время, необходимое для вставки записи, можно грубо разделить на такие промежутки:

Подсоединение: (3)





Посылка запроса на сервер: (2)





Синтаксический анализ запроса: (2)





Вставка записи: (1 * размер записи)





Вставка индексов: (1 * число индексов)





Закрытие: (1)

Подсоединение тут нужно понимать как use db или mysql_connect?

Этот проект нужно начинать с системы управления баз данных!

Если нет опыта, нужно начинать с макета на бумаге.

Затем определится, как будут вносится, изменяться, дополняться данные. Как контролировать правильность данных и связей. Кто будет за это отвечать!!!

Как будут обрабатываться. Требования к надежности.

Из всех этих требований можно выбрать СУБД.

На первый взгляд MySQL не совсем подходит. Он шустрый, простой… Но, с такой структурой запаришься сопровождать. Слишком критичными являются требования к информации. Слишком серьезными могут быть последствия ошибки данных.

Мое мнение, нужно смотреть в сторону Oracle или PostgreSQL.

Структура БД дело десятое.

После того, как база "будет жить" своей жизнью можно приступать к интерфейсу.

Здесь уже Yii незаменимый помощник.

Например пишем игру.

Создаём отдельно БД для пользователей и групп

и отдельно БД для сцен в игре

Тогда БД для пользователей и групп мы можем использовать для другой игры.

Просто не до конца понятно, в БД MySql мы проверяем связанный id записи, который находится в другой таблице(а не в той которой мы добавляем запись) средствами SQL или средствами языка ООП?

или REFERENCE в MySQL ничего не делает?

В этом посте неумолимо попахивает такими страшными терминами, как SSO, HMVC и SOAP.

Я к тому, что если заморачиваться сферическим конем в вакууме - то никто не гарантирует, что подсистема "Здоровье" будет использовать ту же БД, что и основная. Или вообще будет использовать БД. Или еще что-нибудь.

Если получится по-максимуму разделить системы, оставив лишь общих юзеров - хорошо, тогда SSO решает все проблемы.

Если не получится - тогда прямая дорога к веб-сервисам, гоняющим данные туда-сюда по какому-нибудь модному протоколу.

PS. Референсы в MySQL работают начиная с InnoDB. В MyISAM они чисто для справки.

пока делаю на одной БД.

к второй проблеме вернусь позже.

Сейчас появилась ещё одна проблемка

Не могу сообразить как добавить запись в multi_domens_description_multi_domens, когда добавляем описание к существующему домену.

начало файла protected/views/multiDomensDescription/_form.php




<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'multi-domens-description-form',

	'enableAjaxValidation'=>false,

)); ?>


	<p class="note">Fields with <span class="required">*</span> are required.</p>


	<?php echo $form->errorSummary($model); ?>


	<div class="row">

		<?php

		/* TODO Тут я хочу указать id домена в таблице multiDomens, для добавления записи в  multi_domens_description_multi_domens

		Как это правильно сделать?

		echo $form->labelEx($model ,'multiDomens');

		echo $form->textField($model,'multiDomens');

		echo $form->error($model,'multiDomens');

		*/

		?>

	</div>



класс модели MultiDomensDescription




	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'idMultiLanguages' => array(self::BELONGS_TO, 'MultiLanguages', 'id_multi_languages'),

			'multiDomens' => array(self::MANY_MANY, 'MultiDomens', 'multi_domens_description_multi_domens(id_multi_domens_description, id_multi_domens)'),

		);

	}



действие контроллера MultiDomensDescriptionController - Add тоже не знаю как сделать.


	/**

	* Add a new model.

	* If creation is successful, the browser will be redirected to the 'view' page.

	*/

	public function actionAdd()

	{

		$model=new MultiDomensDescription;

	

		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);

	

		if(isset($_POST['MultiDomensDescription']))

		{

			$model->attributes=$_POST['MultiDomensDescription'];

			if($model->save())

			$this->redirect(array('view','id'=>$model->id));

		}

	

		$this->render('add',array(

					'model'=>$model,

		));

	}

PS Подключил модуль http://www.yiiframework.com/extension/esaverelatedbehavior .Стало сохраняться всё сразу как надо. но пока не получается из формы передавать id домена

PSPS передачу с формы сделал но может есть решение лучше




class MultiDomensDescription extends CActiveRecord

{

	public $id_multi_domen=3;






class MultiDomensDescriptionController extends Controller

{


	public function actionAdd()

	{

		$model=new MultiDomensDescription;


		if(isset($_POST['MultiDomensDescription']))

		{

			$model->multiDomens=$_POST['MultiDomensDescription']['id_multi_domen']; //MultiDomens::model()->findByPk($model->id_multi_domen);

$model->attributes=$_POST['MultiDomensDescription'];			

			if($model->saveWithRelated('multiDomens'))

			$this->redirect(array('view','id'=>$model->id));

		}

	

		$this->render('add',array('model'=>$model,));

	}



форма


<div class="row">

	<?php

	echo $form->dropDownList($model,'id_multi_domen',MultiDomens::getList());

	echo $form->error($model,'id_multi_domen');	

	?>

</div>

может у кого-то есть желание поучаствовать в разработке системы за отдельную плату? пишите на мыло хruz@inbox.ru

Постараюсь обеспечить полными требованиями.

кроме Yii, я использую Visual Paradigm, варианты использования, UML, Eclipse PDT, Doxygen, Apache, SVN, MySQL, Gentoo Linux, Libre office

+появилась новая проблема, почистил папку assets(хотя может дело в другом)

слетели стили в генераторе /index.php?r=gii

функционал gii работает, но показывает всё на белом фоне без стилей оформления, где можно покопать?

когда создаю новое приложение gii работает нормально, оформление подгружается.

а разницу между созданным приложением и старым уловить не получается

может потому что файл конфига


	'modules'=>array(

		// uncomment the following to enable the Gii tool

		

		'gii'=>array(

			'class'=>'system.gii.GiiModule',

			'password'=>'password1',

		 	// If removed, Gii defaults to localhost only. Edit carefully to taste.

			//'ipFilters'=>array('172.16.0.11','::1'),

		),

	),

находится вне каталога с приложением (подключается в index.php)

PS проблема была во внешнем конфиге для приложения где прописано




	'assetManager'=>array(

		'basePath'=>dirname(__FILE__).'/../modules/abstract/assets',

	),



если это закомментировать стиль оформления восстанавливается.

Цель такой конфигурации - объединить конфиги для разных приложений и использовать для разных приложений одну папку abstract/assets

Народ у меня такая проблема на форме вызываю метод контроллера

файл контроллера




public function getDomainsArray($income_str)

{

echo $income_str;

preg_match("/([\da-z][\da-z_-]*[\da-z])?\.([\da-z][\da-z_-]*[\da-z])?\.([\da-z][\da-z_-]*[\da-z])\.((xn--[\da-z]{0,20})|([a-z]{2,6}))/",$income_str,$out_arr);

echo $out_arr[0];

return $out_arr;

}



c помощью скобок в рег. выраж. сохраняем элементы строки в массив $out_arr;

вызов в форме

$Domains = $this->getDomainsArray("www.ya.ru");

echo $Domains[0];

И программа вылетает на строке

echo $out_arr[0];

с сообщением Undefined offset: 0

два вопроса

  1. что будет если объявить метод как static

  2. В чем проблема почему я не получаю массив

проблема была в рег. выражении, с ней разобрался

след вопрос

допустим есть три сущности A,B,C(некая БД)

все они связанны по many many

насколько концептуально правильно в классе

AController

делать

C->save();

+вопрос

есть таблица domains и domains_fully(связь many many)

надо выбрать из таблицы domains_fully запись с id которому соответствует массив id-шников. Размер массива может быть от 2 до 4.

я пытаюсь это сделать так.




// Далее массив id-шников которым должен соответствовать id domain_fully

$aRelId[0]=3;

$aRelId[1]=15;

$aRelId[2]=27;

		

$criteria=new CDbCriteria;

$criteria->with = array('multiDomains');

$criteria->select='id';

//$criteria->together = false;               // не понимаю назначение этого атрибута

//$criteria->compare('multiDomains.id',3);

//$criteria->compare('multiDomains.id',15,true,'OR');

$criteria->condition='multiDomains.id=:domainID1 AND multiDomains.id=:domainID2';

$criteria->params=array(':domainID1'=>$aRelId[0]);

$criteria->params=array(':domainID2'=>$aRelId[0]);

$domainFull	= new MultiDomainsFully();

$fdn=$domainFull->findAll($criteria);

foreach ($fdn as $fdn_obj)

{

	print_r($fdn_obj->id);

	echo "\n";

}



и не смотря на то что такие записи есть они не выводятся.

насколько правильно делать поле private в таблице где хранятся связи many many. Как произвести запись в это поле?

фрагмент вьюшки


$this->widget('zii.widgets.CListView', array(

'id' => '#ajaxListView',

'dataProvider'=>$dataProvider,

'itemView'=>'_view',

));


?>

</div>

<?php echo $this->renderPartial('_form', array('model'=>$model));

Yii::app()->clientScript->registerScript('search',

"var ajaxUpdateTimeout;

ajaxUpdateTimeout = setInterval(function ()

{

$.fn.yiiListView.update('#ajaxListView')

},

3000);

");

Как реализовать подгрузку CListView по таймеру на аяксе? таймер вроде пашет.а новые сообщения на ListView не появляются, хотя в базу добавляются нормально