ก่อนที่จะพูดถึงสคีมาและตาราง ฉันอยากจะแบ่งปันสิ่งที่ฉันพยายามทำให้สำเร็จก่อน ฉันกำลังดำเนินการเกี่ยวกับแอปพลิเคชันจัดส่ง โดยฉันมี categories
อยู่บ้าง และแต่ละหมวดหมู่มี price
ที่กำหนดไว้ล่วงหน้า
แต่การกำหนดราคาค่อนข้างน่าเกลียด (ขาดความสมมาตรและรูปแบบ อย่างน้อยฉันก็หาไม่เจอเลย) ฉันจะยกตัวอย่างให้คุณ:
พิจารณาหมวดหมู่ต่อไปนี้: เอกสาร, เอกสารหนัก, แล็ปท็อป, กล่องกระดาษ, กล่องกระดาษหนัก
1) เอกสาร: ใช้สำหรับเอกสารที่มีน้ำหนักเบากว่า ซึ่งมีน้ำหนักต่ำกว่า 0.5 กก. ราคาอยู่ที่ 20$ คงที่
[ราคาที่เก็บไว้ในตารางราคา: 20.00]
เช่น. สำหรับรายการ 300 กรัม ราคาจะอยู่ที่ 20$
2) เอกสารหนัก: สำหรับเอกสารที่มีน้ำหนักเกิน 0.5 กก. ต่างจากหมวดเอกสารตรงที่ไม่มีราคาตายตัว! แต่มีราคาต่อหน่วย: 10$ ต่อกิโลกรัม ซึ่งจะใช้กับน้ำหนักแต่ละกิโลกรัม ยกเว้น/หลัง 0.5 กิโลกรัม
[ราคาที่เก็บไว้ในตารางราคา: 10.00]
เช่น. สำหรับสินค้าขนาด 2 กิโลกรัม ราคาจะอยู่ที่ 35$ (1.5g = 15$ + 0.5 = 20$)
3) แล็ปท็อป: ตรงไปตรงมา 100$ ไม่มีอะไรพิเศษเกี่ยวกับเรื่องนี้ ไม่มีข้อจำกัดใดๆ
[ราคาที่เก็บไว้ในตารางราคา: 100.00]
เช่น. สำหรับสินค้าขนาด 2 กิโลกรัม ราคาจะอยู่ที่ 35$ (1.5g = 15$ + 0.5 = 20$)
4) กล่อง: สิ่งที่น่าสนใจมาถึงแล้ว จนถึงขณะนี้มีเพียงการพึ่งพาเดียวเท่านั้น: weight
แต่อันนี้มีการขึ้นต่อกันเพิ่มเติม: dimension
ซึ่งค่อนข้างคล้ายกับหมวดหมู่เอกสาร สำหรับกล่องที่มีขนาดต่ำกว่า 3 ลูกบาศก์ฟุต (CF) ราคาคือ 80$ ต่อ CF ความแตกต่างระหว่างประเภทเอกสารและกล่องก็คือ เอกสารมีราคาคงที่ ในขณะที่กล่องมีราคาต่อหน่วย แต่เดี๋ยวก่อนยังมีอีกมาก มีข้อจำกัดเพิ่มเติม: อัตราส่วนขนาด-น้ำหนัก ในกรณีนี้คือ 7kg per CF
และหากน้ำหนักของสินค้าเกินอัตราส่วน จะมีการเรียกเก็บเงิน 5$ ของน้ำหนักส่วนเกินแต่ละกิโลกรัม มันสับสนมากฉันรู้ ตัวอย่างอาจช่วยได้:
[ราคาที่เก็บไว้ในตารางราคา: 80.00]
เช่น. สำหรับกล่องขนาด 80 กก. และ 2CF; ราคาจะอยู่ที่ 490$ นี่คือวิธีการ:
ขั้นแรก ให้คำนวณค่าใช้จ่ายปกติ: 80$*2CF = 160$ ทีนี้ ลองพิจารณาว่าจะข้าม อัตราส่วน หรือไม่: เนื่องจาก 1 CF = 7กก. ดังนั้น 2CF = 14กก. แต่น้ำหนักของสินค้าคือ 80 กก. จึง ข้ามอัตราส่วน (14 กก.)
เนื่องจากข้ามอัตราส่วน สำหรับกิโลกรัมพิเศษทั้งหมด (80-14 = 66 กก.) แต่ละกิโลกรัมจะมีราคา 5$: 66*5 = 330$ หลังจากเพิ่มด้วยค่าบริการปกติแล้ว: 330$+160$ = 490$
5) กล่องหนัก: อันนี้สำหรับกล่องที่มีมิติใหญ่กว่า 3CF ความแตกต่างกับกล่องคือราคาต่อหน่วย กล่องหนักคือ 60$ ต่อ CF
[ราคาที่เก็บไว้ในตารางราคา: 60.00]
เช่น. สำหรับกล่องขนาด 80 กก. และ 5CF; ราคาจะอยู่ที่ 525$ นี่คือวิธีการ:
ขั้นแรก ให้คำนวณค่าใช้จ่ายปกติ: 60$*5CF = 300$ ทีนี้ ลองพิจารณาว่าจะข้าม อัตราส่วน หรือไม่: เนื่องจาก 1 CF = 7กก. ดังนั้น 5CF = 35กก. แต่น้ำหนักของสินค้าคือ 80 กก. จึง ข้ามอัตราส่วน (35 กก.)
เนื่องจากข้ามอัตราส่วน สำหรับกิโลกรัมพิเศษทั้งหมด (80-35 = 45 กก.) แต่ละกิโลกรัมจะมีราคา 5$: 45*5 = 225$ หลังจากเพิ่มด้วยการเรียกเก็บเงินปกติแล้ว: 300$+225$ = 325$
หากคุณอ่านมาไกลขนาดนี้ ฉันคิดว่าฉันเชื่อว่าโครงสร้างธุรกิจมีความซับซ้อนมาก ตอนนี้เรามาดูสคีมา categories
ของฉันกันดีกว่า:
+-------------------------+---------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+---------------------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(191) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| dim_dependency | tinyint(1) | NO | | NULL | |
| weight_dependency | tinyint(1) | NO | | NULL | |
| distance_dependency | tinyint(1) | NO | | NULL | |
| dim_weight_ratio | varchar(191) | YES | | NULL | |
| constraint_value | decimal(8,2) | YES | | NULL | |
| constraint_on | enum('weight','dim') | YES | | NULL | |
| size | enum('short','regular','large') | YES | | regular | |
| over_ratio_price_per_kg | decimal(8,2) | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------------------+---------------------------------+------+-----+---------+----------------+
สคีมาของตาราง prices
ด้วย (เป็นตารางโพลีมอร์ฟิกโดยหวังว่าจะสร้างตาราง subcategories
สักวันหนึ่ง):
+----------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| amount | decimal(8,2) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| priceable_type | varchar(191) | NO | MUL | NULL | |
| priceable_id | bigint(20) unsigned | NO | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+----------------+---------------------+------+-----+---------+----------------+
ฉันจะปรับปรุงโครงสร้างนี้เพื่อให้สิ่งต่าง ๆ มีไดนามิกและสอดคล้องกันมากที่สุดเท่าที่จะเป็นไปได้ได้อย่างไร
User (USR) got price (PRI) for product (PRD) based on rule number (RNO).
คุณสามารถจัดทำเอกสารกฎในระบบอื่นได้ - person Damir Sudarevic   schedule 11.08.2018