Php 与数据库模式和设计相关

Php 与数据库模式和设计相关,php,mysql,database-schema,Php,Mysql,Database Schema,我正在为用户建立一个网站,使其能够创建自己的个人资料页面,其中包含关于自己的详细信息,用户还应能够创建页面(类似于G+和FB上的页面),但是,他们可以将当前个人帐户与其页面相关联,或者使用不同的帐户创建单独的页面。应有许多不同的页面(页面类型) 我发现了这张照片: (来源:) 这看起来很有趣,但是,我如何能以更好的方式构建它,例如:学院页面、收集和大学页面、大学页面、医院页面或公司页面等。每个页面都有自己的属性集等。任何帮助都将不胜感激。我在想,Page_type是否可以帮助我根据医院或公司等

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

我发现了这张照片:


(来源:)

这看起来很有趣,但是,我如何能以更好的方式构建它,例如:学院页面、收集和大学页面、大学页面、医院页面或公司页面等。每个页面都有自己的属性集等。任何帮助都将不胜感激。我在想,Page_type是否可以帮助我根据医院或公司等情况将它们分开


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

我粗略地看了一下表。我觉得它令人满意+有问题(或者只是我现在不明白)。如果我们把所有的表格一张一张地看一遍,用几天的时间讨论这些事情,那就更好了。一周的投入和想法的推广可以让我们对即将实现的目标充满信心。对吧?

首先,我想确定所有可能的关系 在用户和配置文件之间

第二,我必须决定哪一张桌子将成为我的主桌,哪一张将成为我的主桌 打开以占据与其他表的关系。那些是桌子 在将来或将来会出现。别忘了我们必须把这样一个 设计到位,不会介意任何形式的扩展

我读了关于graph数据库的评论。别介意,我们还没有准备好在那里潜水。你正走在正轨上,只需要完善你的想法我开始这个讨论,这样其他人也可以加入。

我经常没时间了,但我会尽我最大的努力来讨论事情 虽然我的知识能带我走那么远


如果我正确理解您的需求,我想这可能是实现用户页面的一种方法的粗略设计:

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

我认为@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

祝你好运。希望这能有所帮助。

我已经画了一张我认为应该走的路的图表。下面是解释和sql语句:

解释

  • 帐户:存储连接凭据。假设您接受facebook登录或twitter登录,则必须将每个凭证与同一profil相关联。因此,每个profile用户可以使用3个或更多类型的帐户登录
  • 页面:在这里,您可以放置关于页面的所有基本信息(无论她的类型如何)
  • 外域:这里是魔术。在PHP中,当用户选择“创建大学页面”时,您将显示带有一些字段的适当表单。然后,只将用户填写的字段保存到数据库中。比如:

    • 字段名称='已建立'
    • 字段值='1909'
    对于企业页面,php表单可以发送到sql:

    • 字段名称='CEO'
    • 归档值='Steve Jobs'
  • 角色: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;

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

像Facebook和Google+这样的系统通常使用图形数据库来处理这类数据。你是什么意思?图形数据库?如果我家里没有呢。我在我的开发机器上的localhost中运行了PHP5的mysql设置。请阅读表继承。你在正确的轨道上。添加“page_type”就是单表继承的一个例子。尼尔,谢谢你的回复。这不再是这里的实际问题。我的问题是帐户部分和页面或用户配置文件页面。帐户部分=电子邮件、用户名、密码(以及一组更多详细信息)。超人,感谢您的帮助。我准备在这个论坛上花上几天时间,看看我们能取得什么成就。我担心的是:页面和标准用户。用户不同于页面,页面可以是公司、医院、学校、组织、政府机构等。超人,我现在也发现了这一点:-这很有趣,但是,当涉及到页面时,会产生误导。我在思考你的页面(商业、名人、医院等)这些东西可以帮助我们,但获得一个模式并根据它开始塑造我们的问题并不是一个好主意。所以请容忍我,我不确定其他用户是否会在这里做出贡献。但是请容忍我,明天早上我会向你提出一个解决方案。我希望从这个星期天到下个星期天,我们将有一些事情摆在我们面前别担心,你已经承诺过什么时候给它。现在上床睡觉,我会在梦中为你的问题想些好事情。祝您今天过得愉快。让我把这篇文章加入书签,我明白了。没关系,这与属性有关,但页面和用户配置文件页面共享相同的东西,帐户信息:电子邮件、密码等。我将等到明天,继续在互联网上搜索。非常感谢超人!我期待着!