与数据库模式和设计有关

时间:2014-02-02 13:30:47

标签: php mysql database-schema

我正在建立一个网站,让用户能够创建自己的个人资料页面,其中包含自己的详细信息,用户还可以创建页面(类似于G +和FB上的页面),但是,他们可以将他们关联起来当前个人帐户与他们的页面或创建一个单独的页面与不同的帐户。应该有许多不同的页面(页面类型)。

我发现了这张照片:

http://tomtenthij.nl/images/stuff/lovdbyless_schema.png

然而,这似乎非常有趣,我怎样才能以更好的方式构建它,例如:College Page,或Collect&大学页面,或大学页面或医院页面或公司页面等。每个都有自己的属性等。任何帮助将不胜感激。我在想是否Page_type可以帮助我将每个分开,具体取决于它是医院还是公司等。

编辑:我是数据库模式的初学者,我对PHP代码没有任何问题。但是想知道为多个用户,页面等构建数据库模式的更好方法。

4 个答案:

答案 0 :(得分:3)

我粗略地看了一下桌子。我发现它令人满意+有问题(或者我只是不理解)。如果我们逐一浏览所有表格并讨论几天内的事情,那就更好了。一周的投入和滚动,推出的想法可以让我们对我们将要实现的目标充满信心。正确?

  

首先,我想确定所有可能的关系   在用户和个人资料之间。

     

其次,我必须决定哪个将成为我的主表   与其他桌子占据关系。表是那些   将来或将来。不要忘记,我们必须把这样的   设计到位,不会介意任何延伸。

我阅读了有关图数据库的评论。不要介意这不是我们准备潜入那里的东西。你是正确的,只需要改进想法。 我正在开始讨论,以便其他人也可以加入此处。

  

我经常没时间,但会尽力讨论事情   就像我的知识可以带我走那么远。

答案 1 :(得分:2)

我已经制作了一个我认为要走的路线图。所以就是这样,解释和解释sql如下:

enter image description here

解释

  • 帐户:存储连接凭据。假设您接受Facebook登录或Twitter登录,您必须将每个凭证与相同的profil相关联。因此,用户可以使用每个profil登录3种或更多种帐户。
  • 页面:在这里您可以提供有关页面的所有基本信息(无论她的类型)
  • page_extrafield :这就是魔术。在PHP中,当用户选择“创建大学页面”时,会显示包含某些字段的相应表单。然后,只将用户填写的字段保存到数据库中。喜欢:

    • field_name ='Established'
    • filed_value ='1909'

    对于企业页面,php表单可以发送到sql:

    • field_name ='CEO'
    • filed_value ='史蒂夫乔布斯'
  • 角色:profil可以(或不可以)创建一个页面或多个页面。多个用户可以管理单个页面。因此,您需要一个角色表来存储每个用户角色。我的基本就像'管理员','编辑'或'会员',但你可以更复杂!

所以你需要做的就是使用适当的SQL的多表格php。 这是我在本例中使用的BDD,如果你想自己测试它:

-- Généré le : Mar 18 Février 2014 à 16:50

SET FOREIGN_KEY_CHECKS=0;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT=0;
START TRANSACTION;

--
-- Base de données: `socialnetwork`
--
CREATE DATABASE `socialnetwork` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `socialnetwork`;

-- --------------------------------------------------------

--
-- Structure de la table `account`
--

DROP TABLE IF EXISTS `account`;
CREATE TABLE IF NOT EXISTS `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(250) NOT NULL,
  `password` varchar(50) NOT NULL,
  `credentialtype` enum('Email','Facebook','GPlus','Twitter') NOT NULL DEFAULT 'Email',
  `profil_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `profil_id` (`profil_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `account`
--

INSERT INTO `account` (`id`, `username`, `password`, `credentialtype`, `profil_id`) VALUES
(1, 'luke@jedi.com', '*7AD0EBD5D5AF7AFF797419070CAEAF6A7671328A', 'Email', 1),
(2, '1197666810', '', 'Facebook', 1);

-- --------------------------------------------------------

--
-- Structure de la table `page`
--

DROP TABLE IF EXISTS `page`;
CREATE TABLE IF NOT EXISTS `page` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(50) NOT NULL DEFAULT 'Page' COMMENT 'type of the page ( university, College,etc)',
  `name` varchar(200) NOT NULL COMMENT 'Page Name',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Store general data about page ( common to each page)' AUTO_INCREMENT=3 ;

--
-- Contenu de la table `page`
--

INSERT INTO `page` (`id`, `type`, `name`, `created_at`) VALUES
(1, 'UniversityPage', 'Oxford Official Page', '2014-02-18 16:41:12'),
(2, 'CompagnyPage', 'My Little Compagny', '2014-02-18 16:41:12');

-- --------------------------------------------------------

--
-- Structure de la table `page_extrafield`
--

DROP TABLE IF EXISTS `page_extrafield`;
CREATE TABLE IF NOT EXISTS `page_extrafield` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `field_name` varchar(100) NOT NULL COMMENT 'name of the specific field (like ''location'' or ''logo'')',
  `filked_value` text NOT NULL,
  `page_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `page_id` (`page_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Store every specialized field about the page (depend on the type of the page)' AUTO_INCREMENT=15 ;

--
-- Contenu de la table `page_extrafield`
--

INSERT INTO `page_extrafield` (`id`, `field_name`, `filked_value`, `page_id`) VALUES
(8, 'location', 'https://maps.google.com/maps?f=q&source=s_q&hl=fr&geocode=&q=oxford&sll=37.0625,-95.677068&sspn=61.323728,135.263672&vpsrc=0&t=h&ie=UTF8&hq=&hnear=Oxford,+Royaume-Uni&z=13&iwloc=A', 1),
(9, 'established', '1909', 1),
(10, 'Enrollment', '499 students', 1),
(11, 'Headmaster', 'Dennis Bisgaard', 1),
(12, 'logo', 'http://foo.com/logo.png', 2),
(13, 'Headquarters', 'San Fransisco', 2),
(14, 'CEO', 'John Doe', 2);

-- --------------------------------------------------------

--
-- Structure de la table `profil`
--

DROP TABLE IF EXISTS `profil`;
CREATE TABLE IF NOT EXISTS `profil` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(150) NOT NULL,
  `name` varchar(100) NOT NULL,
  `forname` varchar(100) NOT NULL,
  `picture_url` varchar(500) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- Contenu de la table `profil`
--

INSERT INTO `profil` (`id`, `pseudo`, `name`, `forname`, `picture_url`, `created_at`) VALUES
(1, 'Jedy', 'Luke', 'Skywalker', 'pict1.jpg', '2014-02-18 16:39:06');

-- --------------------------------------------------------

--
-- Structure de la table `role`
--

DROP TABLE IF EXISTS `role`;
CREATE TABLE IF NOT EXISTS `role` (
  `profil_id` int(11) NOT NULL,
  `page_id` int(11) NOT NULL,
  `access` enum('Admin','Editor','Member') NOT NULL DEFAULT 'Member',
  PRIMARY KEY (`profil_id`,`page_id`),
  KEY `page_id` (`page_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Contenu de la table `role`
--

INSERT INTO `role` (`profil_id`, `page_id`, `access`) VALUES
(1, 1, 'Admin'),
(1, 2, 'Editor');

--
-- Contraintes pour les tables exportées
--

--
-- Contraintes pour la table `account`
--
ALTER TABLE `account`
  ADD CONSTRAINT `account_ibfk_1` FOREIGN KEY (`profil_id`) REFERENCES `profil` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Contraintes pour la table `page_extrafield`
--
ALTER TABLE `page_extrafield`
  ADD CONSTRAINT `page_extrafield_ibfk_1` FOREIGN KEY (`page_id`) REFERENCES `page` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Contraintes pour la table `role`
--
ALTER TABLE `role`
  ADD CONSTRAINT `role_ibfk_2` FOREIGN KEY (`page_id`) REFERENCES `page` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `role_ibfk_1` FOREIGN KEY (`profil_id`) REFERENCES `profil` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
SET FOREIGN_KEY_CHECKS=1;
COMMIT;

玩得开心,并说它是否适合你!

答案 2 :(得分:1)

如果我理解你的要求,我认为这可能是实现用户页面的一种方式的粗略设计:

user

    user_id
    user__name
    user__password
    user__email
    ...
    ...

page_type ( Holds Page Ids and Names of various Page Types )

    page_type_id
    page_type__name ( Ex: College , University , Company , ... )

page_attribute ( Holds the Structure/Attributes of various Page Types )

    page_attribute_id
    page_attribute__page_type_id
    page_attribute__number
    page_attribute__order
    page_attribute__input_type ( Ex: 1: Text Line , 2: Text Area , 3: Drop Down List , ... )
    page_attribute__options ( Ex: For input_type having multiple options , specify the list here as CSV )

user_page ( Holds Page Data for each Page for each User )

    user_page_id
    user_page__user_id
    user_page__page_attribute_id
    user_page__page_attribute_data

答案 3 :(得分:1)

我认为@Uours位于正确的页面上,但我建议采用稍微不同的方法,允许您定义属性一次,然后在各种页面上使用它们。类似的东西:

page_types

    page_type_id (PK)
    page_type_name (e.g. College, College & University, University, Hospital, Company, ...)

page_attributes

    page_attribute_id (PK)
    page_attribute_name (e.g. Name, Address, City, Country, Email, ...)
    page_attribute_input_type (e.g. text, checkbox, date, email, password, radio, textarea, select, ...)
    page_attribute_input_options (e.g. list of values, size=, maxlength=, pattern=, ...)

page_type_attributes

    page_id (PK, FK)
    page_attribute_id (PK, FK)
    page_attribute_sequence (PK)
    page_type_attribute_label (defaults to page_attribute_name but can be overriden in case the same attribute is used more than once on a page)

users

    user_id (PK)
    user_name
    ...

user_pages

    user_page_id (PK)
    user_id (FK)
    user_page_type_id (FK)
    user_page_name (What the user calls this page)

user_page_attributes

    user_page_attribute_id (PK)
    user_id (FK)
    user_page_id (FK)
    page_attribute_id (FK)
    user_page_attribute_value
祝你好运。希望这会有所帮助。