ну в принципе каждый выбирает сам. вот пример из сегодняшнего буквально дня:
есть таблицы:
Код:
#
# Структура таблицы `actions`
#
CREATE TABLE actions (
act_ID int(11) NOT NULL auto_increment,
act_TITLE varchar(30) NOT NULL default '',
act_DESC varchar(255) default NULL,
act_ACTIVE int(11) NOT NULL default '1',
PRIMARY KEY (act_ID)
) TYPE=MyISAM PACK_KEYS=0;
# --------------------------------------------------------
#
# Структура таблицы `areas`
#
CREATE TABLE areas (
ar_ID int(11) NOT NULL auto_increment,
ar_PATH text NOT NULL,
ar_DESC varchar(255) default NULL,
PRIMARY KEY (ar_ID)
) TYPE=MyISAM;
# --------------------------------------------------------
#
# Структура таблицы `areas_actions`
#
CREATE TABLE areas_actions (
aa_ID int(11) NOT NULL default '0',
ar_ID int(11) NOT NULL default '0',
act_ID int(11) NOT NULL default '0',
PRIMARY KEY (aa_ID)
) TYPE=MyISAM;
# --------------------------------------------------------
#
# Структура таблицы `permissions`
#
CREATE TABLE permissions (
p_ID int(11) NOT NULL auto_increment,
usr_ID int(11) NOT NULL default '0',
aa_ID int(11) NOT NULL default '0',
PRIMARY KEY (p_ID)
) TYPE=MyISAM;
# --------------------------------------------------------
#
# Структура таблицы `users`
#
CREATE TABLE users (
usr_ID int(11) NOT NULL auto_increment,
usr_LOGIN varchar(20) NOT NULL default '',
usr_PASS varchar(20) NOT NULL default '',
PRIMARY KEY (usr_ID)
) TYPE=MyISAM;
как нетрудно догадаться - это обычная авторизация(груп пока нету).
вот тут было бы идеально использовать FK, но к сожалению на хостинге я не могу создавать таблицы InnoDB.
получается настоящий гемор.
приведу пример обновления настроек доступа для пользователя:
Код:
class Permission
{
.....
function DeleteUserPermissions()
{
if (isset($this->userId) && !empty($this->userId))
{
$db = new MySql(null,"bd",null,null);
$db->MySql_Connect();
$db->MySql_SelectDb();
$selectQuery = "select p.p_ID
from permissions as p
inner join areas_actions as aa
on p.aa_ID = aa.aa_ID
inner join actions as act
on aa.act_ID = act.act_ID
inner join areas as ar
on aa.ar_ID = ar.ar_ID
where usr_ID=" . $this->userId;
//echo $selectQuery;
$db->MySql_QueryDb($selectQuery);
if ($db->dbResult != null)
{
while($row = mysql_fetch_assoc($db->dbResult))
{
if ($this->DeletePermissionById($row['p_ID']) !== 0)
{
return -1;
}
}
return 0;
}
}
return 0;
}
function UpdateUserPermissions($areaPath, $actionId)
{
if (isset($this->userId) && !empty($this->userId))
{
$db = new MySql(null,"bd",null,null);
$db->MySql_Connect();
$db->MySql_SelectDb();
$insertQuery = "insert into Permissions
(usr_ID, aa_ID)
SELECT usr.usr_ID, aa.aa_ID
FROM areas_actions as aa, users as usr
inner join areas as ar
on ar.ar_ID = aa.ar_ID
inner join actions as act
on aa.act_ID = act.act_ID
where ar.ar_PATH = '" . $areaPath . "'
and act.act_ID = " . $actionId . "
and usr.usr_ID = " . $this->userId;
$db->MySql_QueryDb($insertQuery);
if (mysql_affected_rows() > 0)
{
return 0;
}
}
return -1;
}
function DeletePermissionById($permId)
{
$db = new MySql(null,"bd",null,null);
$db->MySql_Connect();
$db->MySql_SelectDb();
$deleteQuery = "delete from permissions where p_ID = "
. $permId
. " limit 1";
$db->MySql_QueryDb($deleteQuery);
if (mysql_affected_rows() > 0)
{
return 0;
}
return -1;
}
function Update($userPermissionInfo)
{
if ($this->DeleteUserPermissions() !== 0)
{
return -1;
}
foreach($userPermissionInfo as $area=>$actions)
{
foreach($actions as $actionId)
{
if ($this->UpdateUserPermissions($area, $actionId) !== 0)
{
return -1;
}
}
}
return 0;
}
.......
}
схема такая: сначала удаляются все настройки пользователя, а затем обновляются(на основе данных формы).
если бы было каскадное удаление, то достаточно было бы дернуть мастер-таблицу и все.
также нету транзакций.