[英]Django MySQL database design
我正在嘗試在Django應用程序上優化MySQL數據庫,該應用程序提供用戶要購買的商品的搜索結果。 向我建議一種選擇是將我的Items
表垂直拆分為多個表。 經過一番思考,我意識到我將表格用於三個單獨的目的:
據我所知,我最好的選擇是根據這些需求拆分表(這是正確的假設嗎?)。
目前,我的模型如下所示:
class Items(models.Model):
categories = models.CharField(max_length=64)
title = models.CharField(max_length=128)
description = models.CharField(max_length=1024)
thumb = models.CharField(max_length=255, unique=True)
vendor = models.CharField(max_length=16)
url = models.CharField(max_length=255, unique=True)
在水平分割之后,表格將如下所示:
# Query all fields in this table for the search term
class ItemSearch(models.Model):
categories = models.CharField(max_length=64)
title = models.CharField(max_length=128)
description = models.CharField(max_length=1024)
# Once a set of relevant results has been compiled, query this table to get all information needed to display it on the page.
class ItemDisplay(models.Model):
title = models.CharField(max_length=128)
thumb = models.CharField(max_length=255, unique=True)
vendor = models.CharField(max_length=16)
# foreign_key referencing ItemSearch.id?
# Once a user clicks on an item they want, send them to a RedirectView associated with the products ItemDisplay.id: r'^item/(?P<item_id>[0-9]+)$'
class ItemOut(models.Model):
url = models.CharField(max_length=255, unique=True)
# foreign_key referencing ItemDisplay.id?
顯然,這些表當前未鏈接,因此一旦查詢ItemSearch
,就無法在ItemDisplay
中找到關聯的行,並且隨后對ItemOut
做同樣的事情。
如何將這些表相互關聯?
您不應該按“目的”拆分表。 如果刪除重復項或消除冗余,則應拆分表。 此過程稱為“數據庫規范化”。
由於我無法發現任何冗余,因此我目前無法真正理解為什么要這么做。 同樣在Django中,稍后使用Django Migrations輕松執行此操作。
這里有一個“數據庫規范化”的很好的例子來理解這個概念: Django-如何規范化數據庫?
數據庫表應該根據它們之間的關系而不是按目的進行拆分(一旦事情開始變得足夠大而無法容納在一台服務器上,那么該規則可能會有例外)。
例如,“一個項目可能屬於許多類別”,或者“許多項目屬於許多類別”-這些項目將具有不同的表結構以反映關系的基數。
閱讀有關提高性能的其他答復中的評論后,拆分表不太可能帶來很多好處。
如果只想返回特定字段以減少網絡流量,請嘗試在queryset上使用values()或values_list()方法。 這將與使用較小的表具有相同的效果。
https://docs.djangoproject.com/zh-CN/1.11/ref/models/querysets/#values
提高性能的明顯方法是添加一些索引,因為您似乎沒有很多。 將它們添加到的第一列將是正在搜索的列。
這是學習索引的一個非常好的資源。 http://use-the-index-luke.com/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.