2013-02-18 57 views
0

所以我是一位视觉设计师类型的人,他已经学会了可观的PHP和一点SQL。针对投资组合网站的数据库设计建议

我正在组建一个个人多媒体投资组合网站。我正在使用CI并喜欢它。问题是我不知道DB设计的蹲点,我一直在重写(并打破)我的表格。这是我需要的。

我有一个表来存储项目:

我想要做的全文searcheson标题和说明,所以我认为这必须是MyISAM数据

项目

  • ID
  • 名称(admin-only人类可读)
  • 标题(标题为游客阅读)
  • 描述
  • 日期(日期的项目结束了)
  • 发布(当项目被张贴时间戳)

然后,我需要标签:

我想我已经想通了。从研究。

标签

  • TAG_ID
  • TAG_NAME

PROJECT_TAGS

  • PROJECT_ID(外资重点项目表)
  • TAG_ID(外键标记表)

这里是我有四个媒体类型的问题;相册,Flash应用程序,打印件和网站设计。没有项目可以是两种类型,因为(有一个例外)它们都需要在视图中显示不同的逻辑。我不知道是否要将媒体类型放在的项目表中,并直接加入类型表,使用中间表来定义关系,如标签。我也在考虑父母类型/子类型。博客,项目 - Flash,项目 - Web。我真的很感激一些方向。

也可能有一些帮助如何有效地查询与给定的解决方案的项目。

回答

0

首先想到的就是你的数据库引擎MyISAM。数据库引擎是MySQL如何存储数据的。有关MyISAM的更多信息,您可以查看:http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html。如果你想有参照完整性(推荐),你希望你的数据库引擎是InnoDB(http://dev.mysql.com/doc/refman/5.0/en/innodb-storage-engine.html)。 InnoDB允许你创建外键并强制执行外键关系(我发现MyISAM不好用)。 MyISAM是MySQL数据库的默认引擎。如果您正在使用phpMyAdmin(这是MySQL和PHP开发强烈推荐的工具),则可以轻松更改数据库的引擎类型(请参阅:http://www.electrictoolbox.com/mysql-change-table-storage-engine/)。因此,可以在MyISAM和InnoDB数据库引擎中完成搜索或查询。您还可以对列进行索引,以加快搜索查询(SELECT语句)速度,但折衷将是INSERT语句花费更长时间。如果你的数据库不是很大(即数百万条记录),你应该看不到有明显的区别。

就您的设计而言,有几件事需要解决。首先要了解的是实体关系图或ERD。这是您的表格及其对应关系的图表。

有几种类型的关系可以存在:一对一关系,一对多关系,多对多关系以及分层关系或递归关系。多对多关系是最复杂的,不能直接在数据库中生成,必须用间歇表来解决(我将用一个例子进一步解释)。

一对一的关系很简单。这方面的一个例子是,如果您的员工表中包含所有员工的列表以及包含所有薪资列表的薪金表。一个员工只能有一个工资,一个工资只能属于一个员工。

有人说,另一个要添加到混合的元素是基数。基数是指这种关系是否存在或必须存在。在上一个员工的例子中,工资和员工之间必须有关系(否则员工可能不会被支付)。这种关系被解读为,员工必须有且只有一个工资和一个工资可能有也可能没有一个且只有一个员工(因为薪水可以不属于员工)。

短语“one and only one”是指它是一对一的关系。短语“必须”和“可能或不可以”是指需要存在或不需要的关系。这转换为设计,因为我在雇员表中的工资ID的外键不能为空,而在工资表中没有引用雇员的外键。

EMPLOYEE
ID PRIMARY KEY
名称VARCHAR(100)
salary_id NOT NULL UNIQUE

SALARY
ID PRIMARY KEY
量INTEGER NOT NULL

的一对多关系nship被定义为拥有一个以上的潜力。例如,与您的投资组合有关,客户可能有一个或多个项目。因此,项目表client_id中的外键字段不能是唯一的,因为它可能会重复。

多对多关系定义在哪里可以有多种方式。例如,正如您已经正确显示的那样,项目可能会有一个或多个标签,标签可能会分配给一个或多个项目。因此,您需要PROJECT_TAGS表来解决多对多问题。

关于直接解决你的问题,你会想创建一个单独的媒体类型表,如果任何潜在的项目存在可以关联到多种类型,你会想要有一个间歇表,并可以添加一个名为primary_type的project_media_type表的字段,它允许您将项目类型主要区分为媒体类型,但如果要按类别进行过滤,则可能属于其他类别。

这给我带来了递归关系。因为您有可能具有递归关系或media_types,所以您需要添加一个名为parent_id的字段。您可以将外键索引添加到引用media_type表的id的parent_id。它必须允许空值,因为所有顶级父级media_types对于parent_id都将具有空值。因此,要选择所有父media_types你可以使用:

SELECT * FROM media_type WHERE parent_id IS NULL 

然后,通过每个家长让孩子你循环,可以使用下面的查询:

SELECT * FROM media_type WHERE parent_id = {$media_type_row->id} 

这将需要在递归函数,让你循环直到没有更多的孩子。使用PHP与层次类别相关的一个例子可以在recursive function category database查看。

我希望这会有所帮助,知道很多,但本质上,我试图强调整个学期的数据库设计和建模。如果您需要更多信息,我也可以附上一个示例ERD。

+0

哇,教一个人钓鱼。很多在那里。我已经理解了一些。但我认为你已经授权我根据我将如何使用信息做出自己的决定。我正在寻找媒体类型和项目之间的多对一关系,所以听起来我需要在Media Types表中包含Parent_id字段,并且只需将type作为字段添加到项目表中,并将type或type_id作为外部项键。 – UglyShark 2013-02-18 19:27:14

+0

就数据库引擎而言。我被InnoDB引擎的优点所吸引,但我的理解是,直到MySQL版本5.6才能在InnoDB引擎上使用FULLTEXT索引。我知道我的服务器正在运行5.4。我曾经考虑过使用标签仅包含一个“关键字搜索”,但认为它更具有传统的全文搜索能力。 – UglyShark 2013-02-18 19:31:55

+0

关于FULLTEXT搜索,我不认为在您的上下文中是必要的。纵观我对电子商务数据库,Intranet数据库和组合数据库FULLTEXT搜索的许多数据库的经验,从未使用过。我认为“关键字搜索”将是最有效的,所有这些都是必要的。 http://stackoverflow.com/questions/1381186/fulltext-search-with-innodb提到,MyISAM FULLTEXT搜索遇到了困难。我很高兴能够提供帮助。另外,您仍然可以搜索描述栏,但不是每个单词都会被索引。 – 2013-02-18 20:10:15

0

为什么不采取什么共同所有,并把它放在一张桌子&有特定的东西在桌面themelves,这样你就可以搜索所有标题&描述在一个。

Basic Table 
- ID int 
- Name varchar() 
- Title varchar() 
etc 

Blogs 
-ID int (just an auto_increment key) 
-basicID int (this matches the id of the item in the basic table) 
etc 

每个媒体类型都有一个。这样,您可以一次搜索所有标题的描述,并在用户通过搜索页面点击链接时加载适当的数据。 (我认为这就是你说你想让人们搜索时的那种功能。)

0

另一个可能的想法是将列添加到项目表中,以满足所有媒体类型需求,然后编辑数据您将只使用给定媒体类型所需的某些列。

这将更有效的数据库(少连接)。

如果你的媒体类型没有很大的不同,你需要的栏目我会选择这个问题。

如果它们差别很大,我会选择@cosmicsafari推荐。