所以我是一个视觉设计师类型的人,他学到了相当数量的PHP和一点SQL。
我正在组建一个个人多媒体投资组合网站。我正在使用CI并喜欢它。问题是我不知道蹲下数据库设计,我一直在重写(并打破)我的表。这就是我需要的。
我有一个表来存储项目:
我想在标题和描述上进行全文搜索,所以我认为这需要是MyISAM
项目
然后我需要标签:
我想我已经弄明白了。来自研究。
代码
PROJECT_TAGS
这是我有四种媒体类型的问题;相册,Flash应用程序,打印件和网站设计。没有项目可以是两种类型,因为(有一个例外)它们都需要在视图中显示不同的逻辑。我不确定是否将媒体类型放在项目表中并直接连接到类型表或使用中间表来定义像标签这样的关系。我也在考虑父类型/子类型,即;博客,项目 - Flash,项目 - Web。我真的很感激一些方向。
也许可以帮助您了解如何使用给定的解决方案有效地查询项目。
答案 0 :(得分:0)
你为什么不把所有人共同的东西放在桌子和桌子上呢?在表格主题中有特定的东西,这样你就可以搜索所有的标题&一个描述。
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
每种媒体类型都有一个。这样你就可以搜索所有描述&当用户从搜索页面点击链接时,一次加载标题并加载适当的数据。 (我假设当你说你希望能够让人们搜索时,你的意思是那种功能。)
答案 1 :(得分:0)
另一个可能的想法是向项目表中添加满足所有媒体类型需求的列,然后在编辑数据时,您将仅使用给定媒体类型所需的某些列。
这将提高数据库效率(减少连接数)。
如果您的媒体类型在列中没有太大差异,我会选择该方法。
如果他们差异很大,我会选择@cosmicsafari推荐。
答案 2 :(得分: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。这是表格及其对应关系的图表。
可以存在多种类型的关系:一对一关系,一对多关系,多对多关系以及层次结构或递归关系。多对多关系是最复杂的,无法直接在数据库中生成,必须使用间歇表解析(我将通过示例进一步解释)。
一对一的关系很简单。例如,如果您有一个包含所有员工列表的员工表和一个包含所有工资列表的工资表。一名员工只能拥有一份工资,一份工资只能属于一名员工。
说到这里,添加到混音中的另一个元素是基数。基数是指关系是否存在或必须存在。在上一个员工示例中,薪水与员工之间必须存在关系(否则员工可能无法获得薪酬)。这种关系被理解为,员工必须拥有一个且只有一个薪水,而薪水可能有也可能没有一个且只有一个员工(因为薪水可以存在而不属于员工)。
短语“一个且唯一一个”是指它是一对一的关系。短语“必须”和“可能会或可能不会”指的是需要存在或不需要的关系。这转换为设计,因为我的employee表中的工资id的外键不能为null,而在工资表中没有引用该员工的外键。
<强> EMPLOYEE 强>
id PRIMARY KEY
名称VARCHAR(100)
salary_id NOT NULL UNIQUE
<强> SALARY 强>
id PRIMARY KEY
金额INTEGER NOT NULL
一对多关系被定义为拥有多个关系的潜力。例如,与您的投资组合相关,客户可能有一个或多个项目。因此,项目表client_id中的外键字段不能是唯一的,因为它可能会重复。
定义了多对多关系,其中多个方式都可以。例如,正如您已正确显示的那样,项目可能有一个或多个标签,并且标签可能分配给一个或多个项目。因此,您需要PROJECT_TAGS表来解析多对多。
关于直接解决您的问题,您需要创建一个单独的媒体类型表,如果项目可以与多个类型相关联的任何可能存在,您可能希望有一个间歇表并可以添加一个project_media_type表中的字段名为primary_type,它允许您将项目类型区分为主要的媒体类型,但如果您按类别进行过滤,则可能属于其他类别。
这让我想到了递归关系。因为您可能有递归关系或media_types,所以您需要添加一个名为parent_id的字段。您可以向parent_id添加外键索引,引用media_type表的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}
这需要在递归函数中,所以你循环直到没有更多的孩子。可以在recursive function category database查看使用与分层类别相关的PHP的示例。
我希望这会有所帮助并且知道它很多,但实质上,我试图突出整个学期的数据库设计和建模。如果您还需要更多信息,我也可以附上一个ERD示例。